运行命令时,docker-compose无法找到要注入到Postgresql的文件

时间:2019-10-02 09:17:16

标签: postgresql docker docker-compose

我正在尝试将.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文件开始工作?

2 个答案:

答案 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