我尝试在多容器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
谢谢!
答案 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"
}
]
},