将文件从 docker 容器写入 AWS 上的主机实例

Posted

技术标签:

【中文标题】将文件从 docker 容器写入 AWS 上的主机实例【英文标题】:writing file from docker container to host instance on AWS 【发布时间】:2018-11-13 14:04:48 【问题描述】:

所以我使用 Travis CI 将我的应用程序自动部署到 AWS Elasticbeanstalk 环境。我有这个问题,我需要更新位于主机文件中的 nginx.conf 文件。 我在该主机内运行单个容器 Docker 映像。 如何将 nginx.conf 文件从 docker 容器复制或链接到主机 nginx.conf 文件。 目前我的 Dockerrun.aws.json 看起来像这样:


    "AWSEBDockerrunVersion": "1",
    "Image": 
        "Name": "some:image:url:here",
        "Update": "true"
    ,
    "Ports": [
        
            "ContainerPort": "8001"
        
    ],
    "Volumes": [
      
        "HostDirectory": "/etc/nginx/nginx.conf",
        "ContainerDirectory": "/home/node/app/nginx.conf"
      
    ]

当我尝试使用 dockerrunversion: 2 时,它在构建时给了我一个错误,即版本错误。 如何将这两个文件与单容器 Docker 应用程序链接?

【问题讨论】:

【参考方案1】:

“卷”键用于映射整个卷,而不是单个文件。请参阅 Dockerrun.aws.json file specifications for an explanation。

我知道有 2 种方法可以解决此问题:1) 自定义 AMI 或 2) 将 Dockerfile 与 Dockerrun.aws.json 一起使用。

1。构建自定义 AMI

构建自定义 AMI 背后的想法是从 Amazon 现有的 AMI 之一启动一个实例。您对其进行所需的更改(在您的情况下,更改 nginx.conf)。最后,您从该实例创建一个新的 AMI,当您在 Elastic Beanstalk 中创建环境时,您可以使用它。 Here are the detailed steps to create your own AMI and how to use it with Elastic Beanstalk.

2。将 Dockerfile 与 Dockerrun.aws.json 一起使用

如果您不构建自己的 AMI,您可以在 Dockerfile 的帮助下复制您的 conf 文件。 Dockerfile 是一个文本文件,它向 Elastic Beanstalk 提供命令以运行以构建您的自定义映像。 Docerfile reference 详细说明了可以添加到 Dockerfile 以构建映像的命令。您将需要使用the Copy 命令,或者如果文件很简单,您可以使用Runecho 来构建它,就像在示例here 中一样。

创建 Dockerfile 后,您需要将 Dockerfile 和 Dockerrun.aws.json 放到一个目录中,并使用两者创建一个 zip 文件。将此作为源包提供给 Elastic Beanstalk。按照this guide 正确构建源包。

【讨论】:

如果我使用 Travis CI 构建镜像并将其上传到 ECS,我需要将复制过程放在哪里。之后,Dockerrun.aws.json 文件从 ECS 读取镜像并将其部署到 Elasticbeanstalk 环境。目前我添加了 COPY nginx.conf /etc/nginx 这一行。但是宿主机中的 nginx.conf 文件保持不变。 你能用shell命令(如echo和>>)构建conf文件吗?如果是这样,请将命令添加到 shell 文件 after_deploy.sh。然后通过 Travis CI 文档中描述的环境变量运行它们:docs.travis-ci.com/user/deployment/elasticbeanstalk/… 我在这个问题中添加了 Travis CI 标签,以防他们的一位专家看到这个问题。它可能是 TravisCI 内部的一个设置。我的回答是从纯粹的 AWS 角度出发。

以上是关于将文件从 docker 容器写入 AWS 上的主机实例的主要内容,如果未能解决你的问题,请参考以下文章

如何从 docker 容器内的主机工作站获取 aws 凭据

从多个 docker 容器读取/写入同一个文件

如何从主机上的编辑器编辑Docker容器中的文件?

AWS Elastic Beanstalk 上的 Docker - 无法从容器访问环境变量

Docker拷贝宿主机与容器中的文件

将Docker主机数据挂在到容器中