如何在Elastic Beanstalk应用程序中共享Docker容器之间的卷?

时间:2015-07-07 20:04:21

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

我尝试在多容器AWS EC2实例中运行的两个Docker容器之间共享数据。

通常情况下,我会在运行容器时将音量指定为命令标志,即:docker run -p 80:80 -p 443:443 --link Widget:Widget --volumes-from Widget --name Nginx1 -d nginx1以将音量从Widget共享到Nginx1。

但是,由于Elastic Beanstalk要求您在dockerrun.aws.json文件中指定Docker配置,然后在内部处理运行docker容器,因此我无法弄清楚如何在两者之间共享数据卷容器

请注意,我没有尝试将数据从EC2实例共享到Docker容器 - 这部分似乎工作正常;相反,我想直接从一个Docker容器共享数据到另一个。我知道docker容器卷与"/var/lib/docker/volumes/fac362...80535"等主机共享,但由于此位置不是静态的,我不知道如何在dockerrun.aws.json文件中引用它。

有没有人找到解决方案或解决方法?

有关dockerrun.aws.json的详细信息以及配置EB正在此处查找:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_v2config.html

谢谢!

3 个答案:

答案 0 :(得分:8)

要完成您想要的操作,您需要正确使用volumesFrom参数。您需要确保使用VOLUME命令公开卷,以便容器共享其内部数据。

这是我用来捆绑一些静态文件以通过网络服务器提供服务的Dockerfile示例:

FROM tianon/true
COPY build/ /opt/static
VOLUME ["/opt/static"]

现在Dockerrun.aws.json的相关部分:

{
    "name": "staticfiles",
    "image": "mystaticcontainer",
    "essential": false,
    "memory": "16"
},
{
    "name": "webserver,
    ...
    "volumesFrom" : [
        {
            "sourceContainer": "staticfiles"
        }
    ]
}

请注意,您不需要在Dockerrun.aws.json文件的根目录中输入任何volumes条目,因为该卷仅在两个容器之间共享,而不是在主机上保留。您还不需要容纳共享卷的容器定义中的任何特定mountPoints密钥,因为具有volumesFrom的容器会自动从引用的容器中获取所有卷。在此示例中,/opt/static容器中staticfiles中的所有文件也可供同一位置的webserver容器使用。

答案 1 :(得分:2)

the AWS docs我发现了这个:

  

您可以在容器上定义一个或多个卷,然后使用   volumesFrom不同容器定义中的参数(在   同一任务)从sourceContainer安装所有卷   他们最初定义的挂载点。

     

volumesFrom参数适用于任务中定义的卷   定义,以及使用Dockerfile构建到映像中的那些。

答案 2 :(得分:0)

您需要在Dockerrun.aws.json文件中指定dockerVolumeConfiguration。这就是我们实现这一目标的方式。基本上将其推送到ECS。

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-volumes.html

这是我的.json文件的摘录

 "volumes": [
    {
      "name": "shared-data",
      "dockerVolumeConfiguration": {
          "scope": "shared",
          "driver": "local",
          "autoprovision": false
      }
    } 
  ],

  "containerDefinitions": [
    {
      "name": "api",
      "image": "account.dkr.ecr.us-west-2.amazonaws.com/api:latest",
      "essential": true,
      "memory": 128,
      "portMappings": [
        {
          "hostPort": 5000,
          "containerPort": 3050
        }
      ],
      "mountPoints": [
        {
          "sourceVolume": "shared-data",
          "containerPath": "/var/area_data"
        }
      ]
    },