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

时间:2017-05-31 12:11:23

标签: docker docker-compose

我使用的是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

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

4 个答案:

答案 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 的更多信息。