postgres
Docker镜像的文档关于环境变量POSTGRES_DB
说道:
当镜像首次启动时,可以使用此可选环境变量来定义默认数据库的不同名称。如果未指定,则将使用POSTGRES_USER的值。
但是我发现这完全不正确。例如,使用以下配置:
version: '3.7'
services:
db:
image: postgres:11.3-alpine
restart: always
container_name: store
volumes:
- postgres_data:/var/lib/postgresql/data/
ports:
- 5432:5432
environment:
- POSTGRES_USER=custom
- POSTGRES_DB=customname
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
secrets:
- db_password
volumes:
postgres_data:
secrets:
db_password:
file: config/.secrets.db_password
默认数据库叫做postgres
,而不是我指定的customname
:
$ docker exec -it store psql -U custom customname
psql: FATAL: database customname does not exist
$ docker exec -it store psql -U custom postgres
psql (11.3)
Type help for help.
postgres=# ^D
我是否漏掉了一些显而易见的东西?
docker volume ls
命令时,它会给我返回一个很长的卷列表,所有这些卷都由类似哈希值的东西描述,我没有看到任何postgres_data
。这是格式改变了还是意味着我没有这样的卷? - cgoldpostgres_data
是在相关的docker_compose
文件中声明的卷的名称。在您的情况下,由ls
命令返回的哈希值卷名称是匿名卷。PostgreSQL 的Dockerfile
定义了一个用于存储数据库数据的/var/lib/postgresql/data
卷。如果该卷没有显式地映射到主机上,则会创建一个匿名卷。使用docker inspect -f '{{ .Mounts }}' container-id
命令可以查看映射。 - b0gusbdocker volume ls
对我来说返回了一个空列表。我在重新启动容器之前删除了主机卷,但它仍然创建了默认数据库而不是自定义数据库。 - Kashif Nazar