Как попасть в psql запущенного контейнера postgres?
Я создал контейнер postgres, используя учебник на веб-сайте fig. Я назвал контейнер db.
Контейнер запущен, и мое приложение подключается к нему нормально. Я попытался запустить команду fig run db psql
при запуске контейнера db и получил ошибку:
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"?
Как я могу войти в интерфейс psql
в работающем контейнере db?
Ответы
Ответ 1
fig создаст контейнер докеров с другим именем, чем тот, который используется в файле fig.yml
.
Я начал работать, найдя имя контейнера с docker ps
и посмотрев на столбец NAMES.
Затем запустите команду psql
в запущенном контейнере с docker exec -ti NAME_OF_CONTAINER psql -U YOUR_POSTGRES_USERNAME
Обратите внимание, что docker exec
запускает команду psql
в запущенном контейнере, а не в docker run
, который запустит новый контейнер.
Update
fig теперь называется docker-compose
Ответ 2
Вам нужно запустить новый контейнер для подключения к нему, запущенному на рис. Это происходит потому, что основной контейнер по умолчанию запускает службу, а если вы делаете fig run db psql
fig, то НЕ запускает службу, а вместо этого запускает клиент psql. См. файл Docker.
Итак, чтобы подключиться к службе PostgreSQL, вам нужно запустить другой контейнер, связанный с тем, который был запущен на рис. См. https://registry.hub.docker.com/_/postgres/.
Во-первых, поскольку fig изменяет имена запущенных контейнеров, проверьте столбец NAMES контейнера docker ps
после выполнения fig up
. Тогда:
docker run -it --link <postgres_container_name>:postgres --rm postgres sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'
Вы можете сделать трюк docker exec
, а также описать @sargas тоже, но способ связывания звучит для меня более канонически.
Ответ 3
Можете ли вы опубликовать результат docker ps
? Я предполагаю, что вам нужно указать порт, который экспонирует контейнер postgres. Выполнение docker ps
должно дать вам
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
948b1f6ebc0a my_postgres:latest "/usr/lib/postgresql 6 days ago Up 6 days 0.0.0.0:49155->5432/tcp db
и глядя под столбом PORTS для вашего контейнера db, вы увидите порт, на котором фактически отображается db. В этом случае это 49155, но докер выбирает случайный порт между 49153 и 65535, если он явно не указан при запуске контейнера. Вам нужно предоставить опцию -p
для psql, чтобы затем настроить этот порт как таковой
psql -p 49155 ...
Источник: https://docs.docker.com/userguide/dockerlinks/