我使用的是docker-compose和v3。我试图在docker中安装一个卷:
./appdata:/appdata
我希望将其作为卷,然后从多个容器引用该卷。 volume configuration reference仅显示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-volume'必须是映射而不是字符串。
显然我知道我需要更改volumes
键/值对,但我不确定如何更改此值,以便我可以在服务之间共享卷。
我还检查了volumes_from
,但这实际上只允许从其他容器继承。我看到有人在包含他们想要的映射的另一个容器上使用volumes_from
,但设置了command: true
以便容器实际上从未运行过,这对我来说就像是一个黑客。 / p>
我该怎么做?
注意,我做有以下工作:
nginx:
volumes:
- ./appdata:/appdata
php:
volumes:
- ./appdata:/appdata
但这只是重复而且是我希望命名卷可以帮助我避免: - )
答案 0 :(得分:80)
可以通过以下方式跨容器共享指定的卷:
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:
答案 1 :(得分:19)
这解决了它而不使用命名卷:
volumes:
- ./appdata:/appdata
所以看起来像:
services:
nginx:
build: ./nginx/
ports:
- 80:80
links:
- php
volumes:
- ./appdata:/appdata
php:
build: ./php/
expose:
- 9000
volumes:
- ./appdata:/appdata
答案 2 :(得分:5)
从版本docker-compose 3开始删除了docker命名卷。
但是,您可以使用extension-fields来避免复制卷源并避免以后出现错字:
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版文件格式开始可用。
答案 3 :(得分:2)
以前的答案对我有很大帮助(谢谢!)但是我花了更多时间来弄清楚如何设置选项以创建共享 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 文档 here 中阅读有关 driver_opts
的更多信息。