我正在尝试将.backup
文件还原到Postgresql数据库。为此,我使用了一个docker-compose文件来启动一个postgres docker容器:
docker-compose.yml
postgresql:
image: postgres
restart: always
ports:
- "5432:5432"
environment:
- POSTGRES_USER:postgres
# - PGDATA:/var/lib/postgresql/data/pgdata/
volumes:
- ${PWD}/project/data/MX/bkup/data:/var/lib/postgresql
command:
- pg_restore -U postgres -d postgres /var/lib/postgresql/ph.backup
当我使用以下命令运行docker-compose文件时:
docker-compose up postgresql
我得到了错误:
(virtual) med@nid:~/projects/project/pkg$ docker-compose up postgresql
Recreating pkg_postgresql_1 ...
Recreating pkg_postgresql_1 ... done
Attaching to pkg_postgresql_1
postgresql_1 | /usr/local/bin/docker-entrypoint.sh: line 176: /pg_restore -U postgres -d postgres /var/lib/postgresql/ph.backup: No such file or directory
pkg_postgresql_1 exited with code 127
即使文件位于卷内,也会发生这种情况
med@nid:~/projects/project/pkg$ docker-compose exec postgresql bash
root@ab7dbe2b0232:/# cd /var/lib/postgresql/
root@ab7dbe2b0232:/var/lib/postgresql# ls -l
total 1054780
drwx------ 19 postgres postgres 4096 Oct 2 08:51 data
-r--r--r-- 1 postgres ssl-cert 1080082803 Sep 27 15:40 ph.backup
我尝试在docker-compose命令中使用-h
的{{1}}参数:
pg_restore
有效的方法:
如果我在pg_restore -h tcp://`docker-machine ip default`:5432 -U postgres -d postgres /var/lib/postgresql/ph.backup
中注释命令目标,请启动docker容器并在其中运行命令,以获取数据!
是否有针对此的修复程序,意思是,有没有办法使该命令直接从docker-compose.yml
文件开始工作?
答案 0 :(得分:4)
有两种形式的Docker Compose command:
。您应该将命令移至同一行
command: pg_restore -U postgres -d postgres /var/lib/postgresql/ph.backup
您拥有的表格分别拼出了每个参数(在YAML列表中);例如
command:
- /bin/ls
- -l
- -r
- -t
(也可以考虑仅在主机上安装PostgreSQL客户端工具并在Docker外部运行;使用localhost
作为主机名,并使用数据库容器的ports:
中的第一个数字作为端口号。 )
答案 1 :(得分:3)
错误来自command
配置的形式。如果您检查完成的postgres容器(docker inspect <container-id>
),则入口点和命令如下所示:
"Cmd": [
"pg_restore -U postgres -d postgres /var/lib/postgresql/ph.backup"
],
"Entrypoint": [
"docker-entrypoint.sh"
]
这实际上意味着默认入口点脚本docker-entrypoint
由一个参数pg_restore
执行。在第176行,脚本执行传入的参数(exec "$@"
)。
exec命令需要一个命令和一个参数列表
exec [command [arguments]]
,但是在这种情况下,命令是由pg_restore
及其参数组成的完整字符串。显然这不是有效的文件
现在,如果您将command
中的docker-compose.yml
更改为:
command: pg_restore -U postgres -d postgres /var/lib/postgresql/ph.backup
检查容器显示以下内容:
"Cmd": [
"pg_restore",
"-U",
"postgres",
"-d",
"postgres",
"/var/lib/postgresql/ph.backup"
]
这意味着exec
将作为命令运行pg_restore
,并将其余部分作为参数传递,并且一切正常。
或者,您可以覆盖docker-compose文件中的入口点以在shell中执行命令:
entrypoint: /bin/bash -c
command:
- pg_restore -U postgres -d postgres /var/lib/postgresql/ph.backup