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-volume’ 必须是映射而不是字符串。

显然我知道我需要更改 volumes 键/值对,但我不确定 如何 更改它,以便我可以在服务之间共享一个卷。

我还检查了 volumes_from 但这实际上只允许从其他容器继承。我见过有人在另一个包含他们想要的映射的容器上使用 volumes_from ,但是设置了 command: true 以便容器永远不会真正运行,对我来说这似乎是一个 hack .

我怎样才能做到这一点?


请注意,我 确实 有以下工作:

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

但这只是重复,我希望命名卷可以帮助我避免:-)

原文由 Jimbo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

从版本 docker-compose 3 开始删除了名为 volumes 的 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 文件格式开始可用。

原文由 Andriy Ivaneyko 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 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:

原文由 Kannaj 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题