В чем разница между запуском docker exec в терминале и в bash-скрипте - PullRequest
0 голосов
/ 27 января 2019

Давайте предположим, что я запускаю следующую команду внутри скрипта:

#!/usr/bin/env bash

docker run --name mydb --rm -e POSTGRES_PASSWORD=kgalli -e POSTGRES_USER=kgalli -p "9999:5432" -v $PWD/db:/opt -d postgres

Когда я запускаю следующую команду для создания базы данных, она отлично работает.

docker exec -e PGPASSWORD=kgalli mydb psql -U kgalli -d template1 -c "CREATE DATABASE kgalli_test WITH OWNER kgalli ENCODING 'UTF8' LC_COLLATE = 'en_US.utf8' LC_CTYPE = 'en_US.utf8';"

Однако, когда ядобавьте эту строку в приведенный выше скрипт, чтобы скрипт не только запускал сервер postgres, но и создавал базу данных, в которой он вышел из строя.

Я не совсем понимаю, почему я получаю следующую ошибку:

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

Я знаю, что могу при помощи команды docker postgres image создать базу данных при запуске.Но на самом деле это не то, чего я хочу достичь.Я просто использую это в качестве примера, чтобы понять проблему.

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Команда docker run сначала creates записывает слой контейнера поверх указанного изображения, а затем starts, используя указанную команду.

Команда docker exec запускает новую команду в рабочем состоянииконтейнер.Если контейнер приостановлен, то команда docker exec не будет выполнена с ошибкой

$ docker pause test

test

$ docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
1ae3b36715d2        ubuntu:latest       "bash"              17 seconds ago      Up 16 seconds (Paused)                       test

$ docker exec test ls

FATA[0000] Error response from daemon: Container test is paused, unpause the container before exec

$ echo $?
1

( ref.1 ) ( ref.2 )

0 голосов
/ 27 января 2019

Когда вы запускаете его в скрипте, скорее всего, это происходит слишком быстро.Команда docker run … немедленно возвращается, а затем docker exec … пытается использовать PostgreSQL, пока сервер базы данных еще запускается.Вам нужно подождать, пока он будет готов, прежде чем создавать дополнительную базу данных.

Тем не менее, postgres image имеет функциональность в своем сценарии точки входа для запуска пользовательских сценариев инициализации.Вы можете поместить свой оператор CREATE DATABASE … в файл или конфигурацию .sql и смонтировать его в /docker-entrypoint-initdb.d в контейнере.Контейнер postgres автоматически запустит его, когда сервер базы данных будет готов.

Документы для этого, похоже, исчезли, но вы можете увидеть реализацию в docker-entrypoint.sh .

0 голосов
/ 27 января 2019

Используя docker run, вы запускаете новый контейнер, используя docker exec, вы выполняете команду в уже запущенном контейнере

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...