Как попасть в 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/