无法从 docker-compose 启动 postgres docker 容器
Unable to start postgres docker container from docker-compose
我正在尝试启动版本为 10.5.
的 postgresql docker 容器
但在此之前我在同一个 docker-compose.yml 文件中使用了 9.6 版本,并且数据库中没有填充数据。
现在更改 postgres 容器 的版本后,我无法 运行 docker-组合。它抛出以下错误。
FATAL: database files are incompatible with server
DETAIL: The data directory was initialized by PostgreSQL version 9.6,
which is not compatible with this version 10.5 (Debian
10.5-2.pgdg90+1)
这是 docker-compose.yml 文件的样子。
version: '2'
services:
postgres_service:
container_name: postgresql_container
restart: always
image: postgres:10.5
volumes:
- postgres-data:/var/lib/postgresql/data
- ./postgresql/init:/docker-entrypoint-initdb.d
ports:
- "5432:5432"
environment:
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=password
volumes:
postgres-data:
driver: local
谁能告诉我问题出在哪里。我在哪里犯错?
在继续使用新的 postgres 版本之前,我是否需要删除任何卷?
我本地也安装了postgresql
postgres=# select version();
version
-------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 10.10 (Ubuntu 10.10-1.pgdg18.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0, 64-bit
(1 row)
这会导致任何问题吗?
问题是因为您的 compose 创建的用于存储数据库的卷仍然保留由 PostgreSQL 9.6
启动的旧数据。该卷名称是 postgres-data
,它是您在 docker-compose.yml
上使用命名卷时创建的。所以简单地摆脱这个,你可以使用下面的一些方法:
- 使用
docker-compose
命令:
运行 docker-compose down -v
,这将停止该组合内的所有容器并删除该组合内的所有命名卷。
你可以看看docker-compose down command
- 使用
docker volume
命令:
运行 docker volume ls
获取您机器上当前卷的列表,我想您也会在该列表中看到您的卷:
DRIVER VOLUME NAME
local postgres-data
运行 docker volume rm postgres-data
删除该卷,如果您的容器仍然 运行 而您无法删除它,那么您可以使用 -f
强制删除它
希望对您有所帮助!
对我有用的是删除项目根目录中的 pgdata
文件夹和 运行 docker-compose build -d
。然后它告诉我
/usr/local/bin/docker-entrypoint.sh: /docker-entrypoint-initdb.d/create-multiple-postgres-databases.sh: /bin/bash: bad interpreter: Permission denied
为了修复它,我 运行
chmod +x pg-init-scripts/create-multiple-postgresql-databases.sh
请注意,.sh 文件名应与您的文件名相匹配。最后,docker-compose up -d
.
我正在尝试启动版本为 10.5.
的 postgresql docker 容器但在此之前我在同一个 docker-compose.yml 文件中使用了 9.6 版本,并且数据库中没有填充数据。
现在更改 postgres 容器 的版本后,我无法 运行 docker-组合。它抛出以下错误。
FATAL: database files are incompatible with server
DETAIL: The data directory was initialized by PostgreSQL version 9.6, which is not compatible with this version 10.5 (Debian 10.5-2.pgdg90+1)
这是 docker-compose.yml 文件的样子。
version: '2'
services:
postgres_service:
container_name: postgresql_container
restart: always
image: postgres:10.5
volumes:
- postgres-data:/var/lib/postgresql/data
- ./postgresql/init:/docker-entrypoint-initdb.d
ports:
- "5432:5432"
environment:
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=password
volumes:
postgres-data:
driver: local
谁能告诉我问题出在哪里。我在哪里犯错? 在继续使用新的 postgres 版本之前,我是否需要删除任何卷?
我本地也安装了postgresql
postgres=# select version();
version
-------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 10.10 (Ubuntu 10.10-1.pgdg18.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0, 64-bit
(1 row)
这会导致任何问题吗?
问题是因为您的 compose 创建的用于存储数据库的卷仍然保留由 PostgreSQL 9.6
启动的旧数据。该卷名称是 postgres-data
,它是您在 docker-compose.yml
上使用命名卷时创建的。所以简单地摆脱这个,你可以使用下面的一些方法:
- 使用
docker-compose
命令:
运行 docker-compose down -v
,这将停止该组合内的所有容器并删除该组合内的所有命名卷。
你可以看看docker-compose down command
- 使用
docker volume
命令:
运行 docker volume ls
获取您机器上当前卷的列表,我想您也会在该列表中看到您的卷:
DRIVER VOLUME NAME
local postgres-data
运行 docker volume rm postgres-data
删除该卷,如果您的容器仍然 运行 而您无法删除它,那么您可以使用 -f
强制删除它
希望对您有所帮助!
对我有用的是删除项目根目录中的 pgdata
文件夹和 运行 docker-compose build -d
。然后它告诉我
/usr/local/bin/docker-entrypoint.sh: /docker-entrypoint-initdb.d/create-multiple-postgres-databases.sh: /bin/bash: bad interpreter: Permission denied
为了修复它,我 运行
chmod +x pg-init-scripts/create-multiple-postgresql-databases.sh
请注意,.sh 文件名应与您的文件名相匹配。最后,docker-compose up -d
.