Docker Compose-在多个容器之间共享命名卷

我正在使用 docker-compose 和 v3。我正在尝试在 docker 中装入一个卷:

./appdata:/appdata

我希望把它作为一个卷,然后从多个容器引用该卷。体积配置参考只显示 data-volume:作为一个命名卷,没有值,所以它看起来不像上面那样。

services:


nginx:
build: ./nginx/
ports:
- 80:80
links:
- php
volumes:
- app-volume


php:
build: ./php/
expose:
- 9000
volumes:
- app-volume


volumes:
app-volume: ./appdata:/appdata

这给了我:

错误: 在文件“ ./docker-compose. yml”中,卷“ app-volul”必须是映射而不是字符串。

显然,我知道我需要更改 volumes键/值对,但我不确定 怎么做是否需要更改它,以便在服务之间共享卷。

我还检出了 volumes_from,但这实际上只允许从其他容器继承。我见过有人在另一个容器上使用 volumes_from,这个容器包含了他们想要的映射,但是设置了 command: true,所以这个容器实际上从来没有运行过,在我看来这就像是一个黑客。

我怎么能这么做?


注意,我 有以下工作:

nginx:
volumes:
- ./appdata:/appdata
php:
volumes:
- ./appdata:/appdata

但这只是复制,我希望一本命名卷可以帮助我避免这种情况: -)

156590 次浏览

这解决了不使用命名卷的问题:

      volumes:
- ./appdata:/appdata

看起来:

services:


nginx:
build: ./nginx/
ports:
- 80:80
links:
- php
volumes:
- ./appdata:/appdata


php:
build: ./php/
expose:
- 9000
volumes:
- ./appdata:/appdata

命名卷可以通过以下方式跨容器共享:

services:
nginx:
build: ./nginx/
ports:
- 80:80
links:
- php
volumes:
- app-volume:location_in_the_container


php:
build: ./php/
expose:
- 9000
volumes:
- app-volume:location_in_the_container


volumes:
app-volume:

下面是我为了更好地理解而使用的一个示例配置。我将从我的 web容器生成的静态文件公开到一个名为 static-content的命名卷,然后由 nginx容器读取和服务:

services:
nginx:
container_name: nginx
build: ./nginx/


volumes:
- static-content:/usr/src/app


web:
container_name: web
env_file: .env
volumes:
- static-content:/usr/src/app/public
environment:
- NODE_ENV=production


command: npm run package


volumes:
static-content:

从版本 docker-compose 3开始删除名为 files 的 docker。

但是,您可以使用 扩展领域来避免重复卷源代码,并防止以后出现输入错误:

version: '3.5'


x-services-volume:
&services-volume
type: bind
source: ./appdata
target: /appdata


services:


nginx:
build: ./nginx/
ports:
- 80:80
links:
- php
volumes: *services-volume


php:
build: ./php/
expose:
- 9000
# Use same way as for nginx if target override not needed.
volumes:
- <<: *services-volume
target: /opt/target-override

注意: 此特性从3.4版本的文件格式开始可用。

以前的答案对我帮助很大(谢谢!)但是需要更多的时间来弄清楚如何设置创建共享 tmpfs卷(内存文件系统)的选项。我分享它是希望在同样的情况下使开发人员的生活更容易。

仅显示 docker-compose.yml相关部分的示例:

version: '3'


volumes:
shared-tmpfs:
driver: local
driver_opts:
type: "tmpfs"
device: "tmpfs"
o: "size=256m,uid=1000"


services:
nginx:
volumes:
- shared-tmpfs:/tmp/mytmpfs


php-fpm:
volumes:
- shared-tmpfs:/tmp/mytmpfs

我使用它来避免 SSD 在开发/监视模式下的大量写操作(构建大量静态 html 文件)。

您可以在官方的 Docker 文档 给你中阅读更多关于 driver_opts的内容。