我的问题是标题说明。
以下是复制步骤。请注意,我正在使用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
。我尝试了绑定,尽管我不想使用绑定,因为备份卷更容易。
谢谢你,洛根
答案 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:{}]
您的绑定都没有绑定到声明的卷,因此您正在有效地创建新的绑定并将声明的绑定保留为空。