假设有2个docker镜像image-a与image-b,想通过docker-compose实现从容器A(FROM image-a)复制一个文件夹到容器B(FROM image-b),而且完成这个文件夹的复制操作是容器A存在的唯一目的。请问如何编写这样的docker-compose配置文件?
使用 v3 的 volumes 配置实现了。通过 volumes 配置一个共享存储(比如这里叫cache-service),在容器A中将需要需要共享的文件夹映射大这个共享存储,在容器B中映射一个文件夹路径到这个共享存储。示例docker compose配置文件如下:
version: '3' services: dotnet-publish: image: cnblogs/cache-service:latest volumes: - cache-service:/app/Cnblogs.Cache.WebApi/publish dotnet-run: image: microsoft/aspnetcore:2.0 volumes: - cache-service:/app command: bash -c "cd /app && dotnet Cnblogs.Cache.WebApi.dll" labels: aliyun.routing.port_80: cache aliyun.lb.port_80: tcp://lb-xxx:80 volumes: cache-service:
image-a里的需要共享到b的数据是不变的,那为什么不在创建image-b时包含进去?
如果是变化的数据比如db_data或者log_data,则不需要专门的镜像,将需要共享的文件夹挂载后通过volumes_from 共享给需要使用的容器即可。
比如共享logdata我是这么配置的:
logdata: mem_limit: 10m image: debian:jessie volumes: - /log:/log - /etc/localtime:/etc/localtime command: echo "Data-only container for log usage" website: mem_limit: 500m restart: always image: registry.cn-hangzhou.aliyuncs.com/jz/home:website-0305 ports: - "2323:2323" volumes_from: - logdata environment: command: /usr/local/bin/gunicorn -b :2323 --config /var/www/app/gunicorn-config.py runserver:app nginx2: mem_limit: 50m restart: always image: nginx:1.8.1 ports: - "80:80" - "443:443" volumes: - ~/website/config/nginx.conf:/etc/nginx/nginx.conf - /etc/letsencrypt/archive:/etc/nginx/ssl volumes_from: - logdata
image-a是基于 microsoft/aspnetcore-build:2.0 镜像 build 自己项目的源代码创建的镜像,image-b就是微软官方的 microsoft/aspnetcore:2.0 镜像。
v3 已经不支持 volumes_from 了
@dudu: 哇用v3啦。现在用volumn name替换了,docker发现大家都这么用volumes_from,改为name volumn后就更简洁了,上面logdata容器就不再需要了。