这就是问题,我需要告诉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"
答案 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'