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

这是事情,我需要告诉Docker不要集装箱的networking,因为它需要连接到一个VPN(企业专用DB)内的MongoDB。

有一个Docker命令,让我做到这一点:– --net=host 。 在这里引用。

所以,例如,当我的本地机器上运行容器,我会做这样的事情:

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

而这个命令将会诀窍。 由此,我可以连接到“私人”的MongoDB。

所以,我的问题是:有没有一种方法定制Elastic Beanstalk上单个Docker环境的--net=host 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" 

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

 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命令。 你会为(我认为) /etc/init/docker做一个files指令。 AWS使用与该文件中的01flip.sh相同的方式编辑Nginxconfiguration。


说明:

64bit Amazon Linux 2015.03 v2.0.2 running Docker 1.7.1平台版本的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意味着当你运行--net=host docker inspect <container id>时,NetworkSettings中没有IP地址。 AWS使用它为Nginx创build服务器指令,并最终生成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 

尽pipe弹性beanstalk通常非常适合使用标准configuration集的应用程序,但是随着AWS提供给EB堆栈的更新,其难以定制和更新。 话虽如此,我已经做了一些像下面这样有点hacky,但工作正常。

 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 

这不是很整洁,至less我必须确保它不会破坏弹性豆茎的更新。 以上是Docker 1.5堆栈,但是您可以使用与您运行的版本类似的东西。

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

或者,例如,如果您想将parameter passing给您的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'