如何在Elastic Beanstalk上自定义docker run命令?

时间:2015-08-12 14:40:11

标签: amazon-web-services docker amazon-ec2 elastic-beanstalk

这就是问题,我需要告诉Docker不要将容器的网络容器化,因为它需要连接到VPN(企业专用数据库)内的MongoDB。

有一个Docker命令让我这样做:--net=host。参考here

因此,例如,在本地计算机上运行容器时,我会执行以下操作:

docker run --rm -it --net=host [image-name]:[version] bash -il

该命令将起到作用。多亏了这一点,我可以连接到“私人”MongoDB。

所以,我的问题是:有没有办法在Elastic Beanstalk上自定义单个Docker环境的docker run命令,这样我就可以添加--net=host

我尝试在config.yml文件中使用container_commands在那里添加该指令,但我认为这不是我所需要的,这里只是一个片段:

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"

3 个答案:

答案 0 :(得分:12)

我最后用两个容器命令修复它

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脚本。不幸的是,我没有记下我的所作所为,因为我最终不需要改变docker run命令。你会为(我认为)files做一个/etc/init/docker指令。 AWS也以与该文件中01flip.sh相同的方式编辑Nginx配置。

说明:

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_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

答案 1 :(得分:4)

虽然弹性beanstalk通常非常适合使用标准配置集的应用程序,但很难定制并保持更新以及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

这不是很整洁,至少我必须确保它不会因弹性beanstalk的更新而中断。上面的内容适用于docker 1.5堆栈,但您可以使用您正在运行的版本执行类似操作。

答案 2 :(得分:2)

请注意,最新版本的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'