Как настроить команду запуска docker на Elastic Beanstalk?
В этом случае мне нужно сказать Docker, чтобы он не помещал контейнеры в сеть, потому что ему нужно подключиться к MongoDB, находящемуся внутри VPN (корпоративная частная БД).
Есть команда Docker, которая позволяет мне делать именно это: --net=host
. Ссылка здесь.
Так, например, при запуске контейнера на моей локальной машине я сделаю что-то вроде:
docker run --rm -it --net=host [image-name]:[version] bash -il
И эта команда сделает трюк. Благодаря этому я могу подключиться к "private" MongoDB.
Итак, мой вопрос: есть ли способ настроить команду docker run
в среде одиночной докеры на эластичном бобовом стебле, чтобы я мог добавить --net=host
?
Я попытался использовать container_commands в файле config.yml
, чтобы добавить туда эту инструкцию, но я не думаю, что это делает то, что мне нужно, здесь это фрагмент:
container_commands:
00-test_command:
command: bundle exec thin --net=host
01-networking-fix:
command: "docker run --rm -it --net=host [image-name]:[version] bash -il"
Ответы
Ответ 1
Я закончил работу с двумя командами контейнера
container_commands:
00_fix_networking:
command: sed -i 's/docker run -d/docker run --net=host -d/' /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh
01_fix_docker_ip:
command: sed -i 's/server $EB_CONFIG_NGINX_UPSTREAM_IP/server localhost/' /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh
Обновление:
Я также должен был установить Upstart script. К сожалению, я не записал, что я сделал, потому что мне не пришлось изменять команду docker run
. Вы бы сделали директиву files
для (я думаю) /etc/init/docker
. AWS редактирует конфигурацию Nginx таким же образом, как и в 01flip.sh
в этом файле.
Пояснение:
В версии платформы 64bit Amazon Linux 2015.03 v2.0.2 running Docker 1.7.1
файл, который вам нужно изменить, /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh
. Этот файл теперь намного сложнее, чем версия Samar, поэтому я не хотел размещать там фактическое содержимое. Однако изменение в основном одно и то же. Там строка, начинающаяся с
docker run -d
Я установил его с помощью команды container:
container_commands:
00_fix_networking:
command: sed -i 's/docker run -d/docker run --net=host -d/' /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh
Это успешно добавляет аргумент --net=host
, но теперь есть еще одна проблема. Система заканчивается недействительной директивой Nginx. Использование --net=host
означает, что при запуске docker inspect <container id>
в NetworkSettings отсутствует IP-адрес. AWS использует это для создания директивы сервера для Nginx и заканчивает создание server :<some port you chose>
(перед добавлением --net=host
он будет выглядеть как server <ip>:<port>
). Мне также нужно было исправить этот файл. Он сгенерирован в /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh
.
01_fix_docker_ip:
command: sed -i 's/server $EB_CONFIG_NGINX_UPSTREAM_IP/server localhost/' /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh
Ответ 2
В то время как эластичный бобовый шток, как правило, хорошо подходит для приложений, которые работают со стандартным набором конфигураций, его трудно настроить и обновить вместе с обновлениями. AWS предоставляет стеки EB. Сказав это, я сделал что-то вроде ниже, которое немного взломано, но отлично работает.
files:
"/opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh":
mode: "000755"
owner: root
group: root
encoding: plain
content: |
#script content of original 04run.sh along with modification on docker run cmd
# eg. I injected multi-ports here
docker run -d \
"${EB_CONFIG_DOCKER_ENV_ARGS[@]}" \
"${EB_CONFIG_DOCKER_VOLUME_MOUNTS[@]}" \
"${EB_CONFIG_DOCKER_ENTRYPOINT_ARGS[@]}" \
"${PORT_ARGS[@]}" \
$EB_CONFIG_DOCKER_IMAGE_STAGING \
"${EB_CONFIG_DOCKER_COMMAND_ARGS[@]}" 2>&1 | tee /tmp/docker_run.log | tee $EB_CONFIG_DOCKER_STAGING_APP_FILE
Это не очень аккуратно, по крайней мере, я должен убедиться, что он не сломается с обновлениями на эластичном бобовом стебле. Вышеупомянутый для стека докеров 1.5, но вы можете сделать что-то подобное с версией, в которой вы работаете.
Ответ 3
Обратите внимание, что последняя версия стека AWS (с Docker 1.7.1) имеет несколько отличную настройку перед развертыванием. Вам нужно будет обновить файл по адресу: /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh
commands:
00001_add_privileged:
cwd: /tmp
command: 'sed -i "s/docker run -d/docker run --privileged -d/" /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh'
или, например, если вы хотите передать args вашему изображению Docker:
commands:
00001_modify_docker_run:
cwd: /tmp
command: 'sed -i "s/\$EB_CONFIG_DOCKER_IMAGE_STAGING/\$EB_CONFIG_DOCKER_IMAGE_STAGING -gzip -enable-url-source/" /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh'