相当于Docker Compose v3中的volumes_from

时间:2017-06-23 11:24:35

标签: docker docker-compose

这里似乎有类似的问题(docker-compose volumes_from equivalent with version 3How to replace volumes_from in docker-composer v3),但我不认为他们回答了这个问题(或者至少我不明白答案如何解决问题问题)。所以让我再试一次,非常具体。

我有这个v2 docker-compose.yml:

version: '2'
services:
  full-tests:
    volumes:
      - ..:/opt/project
      - ../../../ext-libs:/opt/ext-libs
      - ./third-mapping:/opt/third

  unit-tests:
    volumes_from: full-tests

关键是卷的集合定义一次,我可以使用volumes_from轻松地重用它们。

你会如何在v3中重写它?

3 个答案:

答案 0 :(得分:11)

要回答您的问题 - 使用v3无法解决问题 - 请参阅下面的部分。 v3不得用作继承人(也是码头工人的正式声明),应在“群案”中使用。

但是,你应该做的是使用命名卷。

您可以将它与此类

的主机安装卷结合使用
docker volume create --name volume1 -o type=none -o device=/home/$USER/projects/01 -o o=bind

您可以使用3.2:https://docs.docker.com/compose/compose-file/#long-syntax-2中引入的长语法简化此操作,以便在docker-compose文件中定义主机上的命名卷+绑定 例如:

services:
   full-tests:
    volumes:     
      - type: volume
        source: ../
        target: /opt/project
      - type: volume
        source: ../../../ext-libs
        target: /opt/ext-libs

或简称为

services:
   full-tests:
     volumes:     
      - ../:/opt/project
      - ../../../ext-libs:/opt/ext-libs

你不能做什么,将长语法放在顶级“卷”定义下,为该卷命名,并在服务的卷部分重用它 - 这是不可能的。为此,您将使用

volumes:
  project:
    external: true
  third-party:
    external: true

然后使用cli上的“docker volume create”语法创建带有绑定选项的卷,如上面的概述

但你永远不会得到volume_from在这里为你做的事情

v3中没有相应的volumes_from,因为v3不是v2的继承者,它是另一种选择 - 请在此处查看我的评论和来源https://github.com/rancher/rancher/issues/3316#issuecomment-310889283

总结一下 - 如果volume_from在错误的字段中使用错误的方式,则volumes_from和卷有重叠。

a)如果您希望堆栈升级(向下+向上)持久保存数据,您可以选择命名卷 - 现在,如果需要共享2个以上的服务,只需安装此命名卷即可使用volumes:

b)如果你这样做,希望数据在堆栈升级中持续存在(例如,因为它的源代码和图像实际上包括升级),因为在通常的应用程序中+ httpd /代理方案,您将为此创建一个匿名卷使用/var/www在Dockerfile中Volume /var/www,然后使用volumes_from将其挂载到httpd服务中。

b的要点是,在堆栈升级时,将删除anon卷(`docker-compose down删除anon容器,但不删除命名容器),因此升级按预期工作,你有一个新的代码库< / p>

尝试对命名卷执行相同操作会让您在第一次升级时感到非常惊讶,因为代码位于命名卷上并且覆盖“新鲜”映像上的代码库/新容器,因此您将在升级后运行旧代码库。

答案 1 :(得分:1)

您可以使用extension fields来使代码简短,但它与volumes_from不太一样。例如:

version: '3.7'
x-volumes:
  &my-volumes
      - ..:/opt/project
      - ../../../ext-libs:/opt/ext-libs
      - ./third-mapping:/opt/third

services:
  full-tests:
    volumes:
      *my-volumes

  unit-tests:
    volumes:
      *my-volumes

答案 2 :(得分:-1)

我让docker-compose版本3与unison一起工作。基本上必须替换“volumes_from”并创建全局“卷”声明。

version: "3"
services:
  unison:
    container_name: xxx_unison
    image: onnimonni/unison
    environment:
      - UNISON_DIR=/var/www/$DOCKER_WEB_DOMAIN/htdocs/
      - UNISON_USER=www-data
      - UNISON_UID=1000
      - UNISON_GID=1001    
    volumes:
      - unison_file:/var/www/$DOCKER_WEB_DOMAIN/htdocs/
    networks: 
      - frontend    
    ports:
      - "5000:5000"    
  database: 
    container_name: xxx_database
    image: percona
    depends_on:
      - unison
    environment:
      - MYSQL_ROOT_PASSWORD=xxx
      - MYSQL_DATABASE=xxx # Assign a database to be created on container first load  
    volumes: 
      - ./mysql/import:/docker-entrypoint-initdb.d
      - ./mysql/data/:/var/lib/mysql/ 
      - ./logs:/var/log/mysql
      - ./mysql/conf:/etc/mysql/conf.d          
    ports: 
      - "3306:3306"
    networks: 
      - frontend
  web:
    container_name: xxx_web
    image: ubuntu
    depends_on:
      - unison    
    volumes: 
      - ./nginx/ssl/:/etc/nginx/ssl/ 
      - ./logs/:/var/log/nginx
      - ./shell/run.sh:/run.sh
      - unison_file:/var/www/$DOCKER_WEB_DOMAIN/htdocs/
    ports:
      - "80:80"
      - "443:443"
    networks: 
      - frontend
    env_file:
      - ./.env      
networks:
  frontend:
volumes:
  unison_file: