Подтвердить что ты не робот

Как настроить команду запуска 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"
4b9b3361

Ответ 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'