如何在 Elastic Beanstalk 上部署自定义 docker 映像?

Posted

技术标签:

【中文标题】如何在 Elastic Beanstalk 上部署自定义 docker 映像?【英文标题】:How to deploy a custom docker image on Elastic Beanstalk? 【发布时间】:2015-11-02 14:31:57 【问题描述】:

看着这个blog - 5. Create Dockerfile。看来我必须在 Docker.io 上创建一个指向我的私有映像的新 Dockerfile。

而且由于最后一个命令应该是启动一个可执行文件,否则 docker 镜像将最终进入 nirvana,最后有 supervisrd:

FROM flux7/wp-site # This is the location of our docker container.
RUN apt-get install supervisor
RUN mkdir -p /var/log/supervisor
ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf
EXPOSE 80
CMD supervisord -c /etc/supervisor/conf.d/supervisord.conf

这让我有点困惑,因为我有一个经过全面测试的自定义 Docker 映像,以 supervisord 结尾,见下文:

FROM ubuntu:14.04.2
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN apt-get -y update && apt-get upgrade -y
RUN apt-get install supervisor python build-essential python-dev python-pip python-setuptools -y
RUN apt-get install libxml2-dev libxslt1-dev python-dev -y
RUN apt-get install libpq-dev postgresql-common postgresql-client -y
RUN apt-get install openssl openssl-blacklist openssl-blacklist-extra -y
RUN apt-get install nginx -y
RUN pip install "pip>=7.0"
RUN pip install virtualenv uwsgi

RUN mkdir -p /var/log/supervisor
ADD canonicaliser_api /home/ubuntu/canonicaliser_api
ADD config_local.py /home/ubuntu/canonicaliser_api/config/config_local.py
RUN virtualenv /home/ubuntu/canonicaliser_api/venv
RUN source /home/ubuntu/canonicaliser_api/venv/bin/activate && pip install -r /home/ubuntu/canonicaliser_api/requirements.txt
RUN export CFLAGS=-I/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/core/include/
RUN source /home/ubuntu/canonicaliser_api/venv/bin/activate && cd /home/ubuntu/canonicaliser_api/canonicaliser/cython_extensions/ && python setup.py build_ext --inplace
RUN cp /home/ubuntu/canonicaliser_api/canonicaliser/cython_extensions/canonicaliser/cython_extensions/*.so /home/ubuntu/canonicaliser_api/canonicaliser/cython_extensions
RUN rm -rf /home/ubuntu/canonicaliser_api/canonicaliser/cython_extensions/canonicaliser
RUN rm -r /home/ubuntu/canonicaliser_api/canonicaliser/cython_extensions/build

RUN mkdir /var/run/flask-uwsgi
RUN chown -R www-data:www-data /var/run/flask-uwsgi
RUN mkdir /var/log/flask-uwsgi
ADD flask-uwsgi.ini /etc/flask-uwsgi/
ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf

EXPOSE 8888
CMD ["/usr/bin/supervisord"]

那么我如何提供我的自定义图像(CMD?)而不是使用supervisord?除非我忽略了什么......

更新

我已应用建议的更新,但无法通过 DockerHub 上的私有 repo 进行身份验证。

[2015-08-11T14:02:10.489Z] INFO  [1858]  - [CMD-Startup/StartupStage0/AppDeployPreHook/03build.sh] : Activity execution failed, because: WARNING: Invalid auth configuration file
  Pulling repository houmie/canon
  time="2015-08-11T14:02:08Z" level="fatal" msg="Error: image houmie/canon:latest not found"
  Failed to pull Docker image houmie/canon:latest, retrying...
  WARNING: Invalid auth configuration file

S3 存储桶内名为docker 的文件夹中的dockercfg


        "auths": 
                "https://index.docker.io/v1/": 
                        "auth": "xxxx",
                        "email": "xxx@gmail.com"
                
        

Dockerrun.aws.json 是:


   "AWSEBDockerrunVersion":"1",
   "Authentication":
      "Bucket":"dd-xxx-ir-01",
      "Key":"docker/dockercfg"
   ,
   "Image":
      "Name":"houmie/canon",
      "Update":"true"
   ,
   "Ports":[
      
         "ContainerPort":"8888"
      
   ]

【问题讨论】:

【参考方案1】:

使用 Elastic Beanstalk 部署容器时,您可以告诉它使用您定义的 Dockerfile 在每个主机上本地构建您的映像,或者使用注册表中的预构建映像。

您不一定要重新创建您的镜像,您可以只使用您已有的镜像(无论是在 Docker Hub 上还是在私有注册表上)。

如果您的应用程序在托管存储库中可用的映像上运行,您可以在 Dockerrun.aws.json 文件中指定该映像并省略 Dockerfile

如果您的注册表帐户需要身份验证,那么您需要在 S3 存储桶上提供一个 .dockercfg 文件,该文件将由 Docker 主机提取(因此您需要通过 IAM 为实例提供适当的权限角色)。

Dockerrun.aws.json文件的Authentication参数中声明.dockercfg文件。确保 Authentication 参数包含有效的 Amazon S3 存储桶和密钥。 Amazon S3 存储桶必须托管在与使用它的环境相同的区域中。 Elastic Beanstalk 不会从托管在其他区域的 Amazon S3 存储桶下载文件。将操作 s3:GetObject 的权限授予实例配置文件中的 IAM 角色。

因此,您的 Dockerrun.aws.json 可能看起来像这样(考虑到您的映像托管在 Docker Hub 上)。


  "AWSEBDockerrunVersion": "1",
  "Authentication": 
    "Bucket": "myBucket",
    "Key": ".dockercfg"
  ,
  "Image":
  
   "Name": "yourRegistryUser/yourImage",
   "Update": "true"
  ,
  "Ports": [
    
     "ContainerPort": "1234"
    
  ],
  "Volumes": [
    
     "HostDirectory": "/var/app/mydb",
     "ContainerDirectory": "/etc/mysql"
    
  ],
  "Logging": "/var/log/nginx"

查看official documentation,了解有关配置和可用选项的更多详细信息。

至于你运行什么命令(supervisord,随便),都无所谓。

【讨论】:

感谢您的回复。 SO 的规则规定,接受的答案应该是自包含的,无需参考其他来源来理解它。如果不阅读链接的文档,我仍然不明白。一旦我读了它,我又回来了。谢谢 谢谢,我意识到我的答案也不完全正确,所以我用更多信息和具体细节重新做了。现在,我觉得还可以。感谢您的建议。 感谢更新。我已经用一些更新更新了我的问题。你遇到过身份验证问题吗? 根据this,您的 dockercfg 文件中不需要那个“auths”对象。

以上是关于如何在 Elastic Beanstalk 上部署自定义 docker 映像?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 aws cli 在 Elastic Beanstalk 上上传和部署?

如何在 AWS Elastic Beanstalk 上部署 django 频道 2.x?

在 Elastic Beanstalk 上部署时出错 - Rails

如何在部署应用程序 Elastic beanstalk 上修改 NGINX 配置

在 AWS Elastic Beanstalk 上部署 rails 应用程序

如何在 nitrous io 盒上配置 git 以部署到 AWS Elastic Beanstalk?