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

Amazon web services 如何在Elastic Beanstalk上自定义docker run命令?,amazon-web-services,docker,amazon-ec2,amazon-elastic-beanstalk,Amazon Web Services,Docker,Amazon Ec2,Amazon Elastic Beanstalk,问题是,我需要告诉Docker不要将容器的网络容器化,因为它需要连接到VPN(企业专用数据库)中的MongoDB 有一个Docker命令,让我来做这件事:--net=host。参考资料 例如,在本地计算机上运行容器时,我将执行以下操作: docker run --rm -it --net=host [image-name]:[version] bash -il 这个命令会起作用的。多亏了这一点,我可以连接到“私人”MongoDB 因此,我的问题是:有没有办法在Elastic Beanstalk

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

有一个Docker命令,让我来做这件事:
--net=host
。参考资料

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

docker run --rm -it --net=host [image-name]:[version] bash -il
这个命令会起作用的。多亏了这一点,我可以连接到“私人”MongoDB

因此,我的问题是:有没有办法在Elastic Beanstalk上自定义单个docker环境的
docker run
命令,以便添加
--net=host

我曾尝试使用into
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"

虽然elastic 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

这不是很整洁,至少我必须确保它不会因为elastic beanstalk的更新而中断。上面的一个是针对docker 1.5 stack的,但是您可以对正在运行的版本执行类似的操作。

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

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
相同的方式编辑Nginx配置


说明:

在运行Docker 1.7.1的64位Amazon Linux 2015.03 v2.0.2平台版本中,需要编辑的文件是
/opt/elasticbeanstalk/hooks/appdeploy/execate/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
时,网络设置中没有IP地址。AWS使用它为Nginx创建服务器指令,并最终生成
服务器:
(在添加
--net=host
之前,它看起来像
服务器:
)。我也需要修补那个文件。它是在
/opt/elasticbeanstalk/hooks/appdeploy/incode/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

请注意,最新版本的AWS堆栈(带有Docker 1.7.1)的预部署设置稍有不同。您需要在以下位置更新该文件:
/opt/elasticbeanstalk/hooks/appdeploy/incode/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'
或者,例如,如果要将参数传递给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'

你好,萨玛!我在试着理解你的解决方案。在“内容”部分中,在何处或如何添加命令?就像这样:“docker run-d \--net=host”?config.yml的引用:这对我很有用。这也是我对upstart脚本所做的更改,@mqsoh在上面的“更新”中指出了这一点
02_eb_docker\u upstart:command:sed-i的/$eb_CONFIG\u NGINX_UPSTREAM\u IP/localhost/'/etc/init/eb docker.conf
@Hari:你让它在连续部署中起作用了吗?以上(以及您的)容器命令对我有效,但仅适用于第一次部署。在那之后,部署失败了,因为他们抱怨正在使用的地址。@nunos不幸的是,我没有得到测试结果-我最终没有使用主机网络。对不起@mqsoh由于所有副作用,您最终没有使用此解决方案,您能告诉我您做了什么,因为您的更新非常不清楚。尤其是现在,自从这篇文章发表以来,docker的新贵发生了巨大的变化,我试图提供当时我所拥有的信息。很快我就不再使用豆茎了,所以很遗憾我不能帮助你。