【问题标题】:How to customize the docker run command on Elastic Beanstalk?如何在 Elastic Beanstalk 上自定义 docker run 命令?
【发布时间】:2015-11-05 06:01:08
【问题描述】:

事情是这样的,我需要告诉 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

我尝试使用container_commandsconfig.yml 文件中添加该指令,但我认为这不能满足我的需要,这是一个sn-p:

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"

【问题讨论】:

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


    【解决方案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 脚本。不幸的是,我没有写下我所做的,因为我最终不需要更改docker run 命令。你会为(我认为)/etc/init/docker 做一个files 指令。 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
    

    【讨论】:

    • 这对我有用。这也是我为@mqsoh 在上面的“更新”中指出的新贵脚本所做的更改。 02_eb_docker_upstart: command: sed -i 's/$EB_CONFIG_NGINX_UPSTREAM_IP/localhost/' /etc/init/eb-docker.conf
    • @Hari:你有没有让它在连续部署中工作?上述(和你的)容器命令对我有用,但适用于第一次部署。之后,部署失败,因为它们抱怨地址正在使用中。
    • @nunos 不幸的是我没有去测试它——我最终没有使用主机网络。对不起!
    • @mqsoh 由于所有副作用,您最终没有使用此解决方案,您能否指出您所做的事情,因为您的更新非常不清楚。尤其是现在,自从这篇文章以来,Docker 的新贵已经发生了巨大的变化。
    • @Relic,我试图提供尽可能多的信息。此后不久我就完全停止使用 Beanstalk,所以很遗憾我无法为您提供帮助。
    【解决方案2】:

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

    这不是很整洁,至少我必须确保它不会因弹性豆茎的更新而中断。以上是针对 docker 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'
    

    【讨论】:

      猜你喜欢
      • 2015-11-02
      • 2020-06-20
      • 2015-09-15
      • 2015-07-31
      • 2014-12-08
      • 2019-01-16
      • 2012-08-13
      • 2020-06-21
      • 2011-12-24
      相关资源
      最近更新 更多