PGAdmin每次“docker-compose up”都会创建新的随机卷

14

每次我运行以下命令:

> docker-compose up -d
在我拥有以下docker-compose.yaml文件的目录中,我会得到一个新的随机命名的卷。

docker-compose.yaml:

version: '3.7'

services:

  pgadmin:
    restart: always
    image: dpage/pgadmin4
    container_name: pgadmin_container
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-foobar}
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-password}
    ports:
      - "${PGADMIN_PORT:-8080}:80"

命令行输出:

C:\postgres> docker-compose up -d
Creating network "postgres_default" with the default driver
Creating pgadmin_container ... done
C:\postgres> docker volume ls
DRIVER              VOLUME NAME
local               3ee8f970ff477052c6fba9001575a0efa0254deb8dcf73ca97d0422231c74931
C:\postgres> docker-compose down
Stopping pgadmin_container ... done
Removing pgadmin_container ... done
Removing network postgres_default
C:\postgres> docker-compose up -d
Creating network "postgres_default" with the default driver
Creating pgadmin_container ... done
C:\postgres> docker volume ls
DRIVER              VOLUME NAME
local               3ee8f970ff477052c6fba9001575a0efa0254deb8dcf73ca97d0422231c74931
local               705dad9c905eb8f1679a9ee4ff290363c40f5285b8048204cab44bce26916845
C:\postgres>

您会发现在第一次 "up" 之后,有一个名称为64个字符的卷,但在第二次调用 "docker-compose up" 之后,就会变成两个。这种模式会继续下去。

是什么导致了这些随机命名的卷?如何防止它们的创建或强制系统重复使用它们?

实际上,我已经编辑了我的docker-compose.yaml文件,以达到重新创建问题的最小要求。实际上,还有一个使用相同文件启动的Postgres数据库。

2个回答

27

如果您使用 docker inspect dpage/pgadmin4 进行查看,您会看到如下内容:

"Volumes": {
    "/var/lib/pgadmin": {}
}, 

这意味着在其Dockerfile中,它定义了一个类似下面的匿名卷:

VOLUME ["/var/lib/pgadmin"]

以上操作会使得每次启动/关闭服务时,卷名称都会发生更改。如需保持名称不变,可以使用命名卷(Named volumes)进行覆盖,例如:



version: '3.7'

services:
  pgadmin:
    restart: always
    image: dpage/pgadmin4
    container_name: pgadmin_container
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-foobar}
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-password}
    ports:
      - "${PGADMIN_PORT:-8080}:80"
    volumes:
      - my-data:/var/lib/pgadmin

volumes:
    my-data:

您可以参考来了解更多信息。


与我在问题中提供的示例YAML文件不同,我实际上有一个“卷”部分。我的问题是我没有指定容器的目录为“/var/lib/pgadmin”,而是使用了其他内容。实际上,这与没有它是一样的。 感谢您的答案,它解决了我的问题。 - MalcLear

4
根据文档,该镜像在以下位置创建一个卷: docs
/var/lib/pgadmin

这是pgAdmin存储会话数据、用户文件、配置文件和配置数据库的工作目录。将此目录映射到主机上,可以轻松地在容器调用之间维护配置。使用docker inspect container_id命令可以查看容器的详细信息:
"Mounts": [
    {
        "Type": "volume",
        "Name": "70c8ae8e1de3e5d6c71fa9c63930cc75761132f4fdb75a2982b32454313b78c6",
        "Source": "/var/lib/docker/volumes/70c8ae8e1de3e5d6c71fa9c63930cc75761132f4fdb75a2982b32454313b78c6/_data",
        "Destination": "/var/lib/pgadmin",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],

看起来每次都会创建一个匿名卷。

如果要重复使用该卷,请使用docker-compose start/stop而不是docker-compose up/down。类似的问题在这里讨论过。


2
docker-compose down默认情况下不会删除卷(参考https://docs.docker.com/compose/reference/down/)。 - masseyb
我认为这解释了创建容器时保留卷数据的原因。 - b0gusb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接