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

may*_*r86 23 amazon-ec2 amazon-web-services docker amazon-elastic-beanstalk

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

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

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

docker run --rm -it --net=host [image-name]:[version] bash -il
Run Code Online (Sandbox Code Playgroud)

而这个命令将起到作用.多亏了这一点,我可以连接到"私人"MongoDB.

所以,我的问题是:有没有办法docker run在Elastic Beanstalk上自定义Single Docker Environment 的命令,所以我可以添加--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"
Run Code Online (Sandbox Code Playgroud)

mqs*_*soh 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
Run Code Online (Sandbox Code Playgroud)

更新:我还必须修复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
Run Code Online (Sandbox Code Playgroud)

我用容器命令修复它:

container_commands:
  00_fix_networking:
    command: sed -i 's/docker run -d/docker run --net=host -d/' /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh
Run Code Online (Sandbox Code Playgroud)

这成功地增加了--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
Run Code Online (Sandbox Code Playgroud)


Sam*_*mar 4

虽然 Elastic 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
Run Code Online (Sandbox Code Playgroud)

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