Docker compose总是创建一个新卷而不是使用命名卷

时间:2020-07-22 04:04:09

标签: docker docker-compose

我的问题是标题说明。

以下是复制步骤。请注意,我正在使用docker compose文件版本3.3,因为我正在使用docker-compose的apt python版本运行此文件,因为ARM64没有二进制文件。

使用以下内容创建一个docker文件:

version: "3.3"

volumes:
  owncloud_data:
    external: true
  owncloud_mysql:
    external: true
  owncloud_backup:
    external: true
  owncloud_redis:
    external: true

services:

  traefik:
    image: "traefik"
    container_name: "traefik"
    restart: "always"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.tlschallenge=true"
     #- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      # Be sure to have LeGo installed
      - "--certificatesresolvers.myresolver.acme.email=<my email>"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"


  whoami:
    image: "containous/whoami"
    container_name: "simple-service"
    restart: "always"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`<my domain>`)"
      - "traefik.http.routers.whoami.entrypoints=websecure"
      - "traefik.http.routers.whoami.tls.certresolver=myresolver"

  owncloud:
    image: "owncloud/server"
    container_name: "owncloud"
    restart: "always"
    depends_on:
      - db
      - redis
    environment:
      - OWNCLOUD_DOMAIN=owncloud.<my domain>
      - OWNCLOUD_DB_TYPE=mysql
      - OWNCLOUD_DB_NAME=owncloud
      - OWNCLOUD_DB_USERNAME=owncloud
      - OWNCLOUD_DB_PASSWORD=owncloud
      - OWNCLOUD_DB_HOST=db
      - OWNCLOUD_ADMIN_USERNAME=<my username>
      - OWNCLOUD_ADMIN_PASSWORD=<my password>
      - OWNCLOUD_MYSQL_UTF8MB4=true
      - OWNCLOUD_REDIS_ENABLED=true
      - OWNCLOUD_REDIS_HOST=redis
    healthcheck:
      test: ["CMD", "/usr/bin/healthcheck"]
      interval: 30s
      timeout: 10s
      retries: 5
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.owncloud.rule=Host(`<my domain>`)"
      - "traefik.http.routers.owncloud.entrypoints=websecure"
      - "traefik.http.routers.owncloud.tls.certresolver=myresolver"
    volumes:
      - type: volume
        source: owncloud_data
        target: /owncloud/data

  db:
    image: webhippie/mariadb:latest
    restart: always
    environment:
      - MARIADB_ROOT_PASSWORD=owncloud
      - MARIADB_USERNAME=owncloud
      - MARIADB_PASSWORD=owncloud
      - MARIADB_DATABASE=owncloud
      - MARIADB_MAX_ALLOWED_PACKET=128M
      - MARIADB_INNODB_LOG_FILE_SIZE=64M
    healthcheck:
      test: ["CMD", "/usr/bin/healthcheck"]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - type: volume
        source: owncloud_mysql
        target: /owncloud/mysql
      - type: volume
        source: owncloud_backup
        target: /owncloud/backup

  redis:
    image: webhippie/redis:latest
    restart: "always"
    environment:
      - REDIS_DATABASES=1
    healthcheck:
      test: ["CMD", "/usr/bin/healthcheck"]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - type: volume
        source: owncloud_redis
        target: /owncloud/redis

在启动容器之前,我先运行以下命令:

for v in owncloud_data owncloud_mysql owncloud_backup owncloud_redis; do
    sudo docker volume create $v
done

然后我运行sudo docker-compose up

当我运行sudo docker volume ls时,我得到了较早创建的四个(悬挂卷),还有四个是从docker compose创建的。怎么了我明确指定了他们的名字。我不确定为什么traefik容器的绑定有效。

我似乎已经尝试了一切。我用引号引起来。我尝试了前置的项目名称。我尝试了短语法owncloud_data:/owncloud/data。我尝试了绑定,尽管我不想使用绑定,因为备份卷更容易。

谢谢你,洛根

1 个答案:

答案 0 :(得分:1)

docker-compose正在使用您命名的卷,用于指定的绑定。但是,它还会在您正在使用的图像上为每个VOLUME声明创建未命名的卷,而不会显式绑定。

我制作了这个小脚本,从您使用的图像中提取声明的卷:

images="traefik containous/whoami owncloud/server webhippie/mariadb:latest webhippie/redis:latest"

echo $images | xargs -n1 docker pull

docker inspect $images -f '{{.RepoTags}}, {{.Config.Volumes}}'

结果:

[traefik:latest], map[]
[containous/whoami:latest], map[]
[owncloud/server:latest], map[/mnt/data:{}]
[webhippie/mariadb:latest], map[/var/lib/backup:{} /var/lib/mysql:{}]
[webhippie/redis:latest], map[/var/lib/redis:{}]

您的绑定都没有绑定到声明的卷,因此您正在有效地创建新的绑定并将声明的绑定保留为空。