你需要做的是使用一个卷,并将该卷挂载到你想要它出现在的任何容器中。
完全在Docker内部
你可以完全在 Docker 内部完成这个过程。
这里有一个例子(精简版 - 实际文件当然会比这个多得多)。
version: '3'
services:
nginx:
volumes:
- asset-volume:/var/lib/assets
asset:
volumes:
- asset-volume:/var/lib/assets
volumes:
asset-volume:
在底部定义了一个单独的卷,名为“asset-volume”。
然后在每个服务中,您告诉Docker将该卷挂载到某个路径上。我在容器内展示了示例路径,只需将其调整为容器内希望它们存在的任何路径即可。
该卷是一个独立的实体,不归属于任何特定的容器。它只是被挂载到每个容器中,并且是共享的。如果一个容器修改了内容,则它们所有的容器都会看到更改。
请注意,如果您希望仅有一个容器对其进行更改,则始终可以将该卷作为只读卷挂载到某些服务中,方法是在卷字符串的末尾添加:ro。
services:
servicename:
volumes:
- asset-volume:/var/lib/assets:ro
使用主机目录
另一种方法是使用主机上的目录并将其挂载到容器中。这样做的好处是您可以直接使用Docker之外的工具(例如GUI文本编辑器和其他工具)在文件上进行操作。
这与前面的方法相同,只不过您不需要在Docker中定义一个卷,而是将外部目录挂载进来即可。
version: '3'
services:
nginx:
volumes:
- ./assets:/var/lib/assets
asset:
volumes:
- ./assets:/var/lib/assets
在这个示例中,本地目录"assets"使用相对路径
./assets
被挂载到两个容器中。
根据环境同时使用
您还可以为不同的开发和生产环境设置它。将所有内容放入docker-compose.yml中,除了卷挂载。然后再创建两个文件。
- docker-compose.dev.yml
- docker-compose.prod.yml
在这些文件中,只需放置定义卷挂载的最小配置。我们将把这与docker-compose.yml混合以得到最终配置。
然后使用此方法。它将使用docker-compose.yml中的配置,并将第二个文件中的任何内容作为覆盖或补充配置。
docker-compose -f docker-compose.yml \
-f docker-compose.dev.yml \
up -d
对于生产环境,只需使用 prod 文件而不是 dev 文件。
这里的想法是将大部分配置保留在docker-compose.yml中,只将最小化的区别设置在备用文件中。
示例:
docker-compose.prod.yml
version: '3'
services:
nginx:
volumes:
- asset-volume:/var/lib/assets
docker-compose.dev.yml
version: '3'
services:
nginx:
volumes:
- ./assets:/var/lib/assets