docker-compose не может найти файл для внедрения в Postgresql при запуске команды - PullRequest
5 голосов
/ 02 октября 2019

Я пытаюсь восстановить файл .backup в базе данных Postgresql. Для этого я использую файл docker-compose для запуска docker-контейнера postgres:

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

Я попытался использовать аргумент -h pg_restore в команде docker-compose:

pg_restore -h tcp://`docker-machine ip default`:5432 -U postgres -d postgres /var/lib/postgresql/ph.backup

Что работает : Если я прокомментирую цель команды в docker-compose.yml, запустите Docker-контейнер и выполните команду внутри него. Я получаю данные для инъекции!

Есть ли исправление для этого? Значение, есть ли способ заставить команду работать напрямую из * 1030? * файл?

Ответы [ 2 ]

4 голосов
/ 02 октября 2019

Существует две формы 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: в качественомер порта.)

3 голосов
/ 02 октября 2019

Ошибка возникает из-за конфигурации 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...