psql проблем со входом в docker точку входа. sh скрипт - PullRequest
0 голосов
/ 05 февраля 2020
#!/bin/sh

until nc -vz postgresql 5432 &>/dev/null; do
    sleep 1
done

if [ "$( psql -h postgresql -U postgres -w -tAc "SELECT 1 FROM pg_database WHERE datname='devdb'" )" = '1' ]
then
    echo "Database already exists"
else
     echo "Running db creation & init routines"
fi

exec "$@"

У меня есть два контейнера 1. postgresql 2. Служба graphql (оба основаны на альпийском языке) У меня есть вышеупомянутый скрипт (сокращенный) в моей точке входа. sh, который вызывается как часть файла dockerfile службы graphql , Когда я запускаю контейнер в docker -compose, я получаю ошибку как

dss-graphql                 | psql: fe_sendauth: no password supplied

Я установил PGPASSWORD в контейнере postgresql. (также установите POSTGRES_PASSWORD и добавьте меру).

Я могу запустить команду psql внутри контейнера и получить результат как 1. Когда то же самое запускается из сценария точки входа, он говорит: psql: fe_sendauth: no password supplied

Есть какие-нибудь идеи по поводу этого поведения? копирование / в том числе postgresql docker точка входа изображения. sh это не то, что я хочу сделать.

version: "3.7"
services:

  # postgresql 
  postgresql        :
    container_name  : postgresql
    hostname        : postgresql
    image           : postgres:10-alpine
    volumes         : 
                    - /var/lib/postgres/data
    networks        : 
                    - backend
    ports           : 
                    - 5432:5432
    restart         : on-failure
    env_file        :
                    - database.env 
  # dss-graphql
  dss-graphql             :
    container_name        : dss-graphql
    hostname              : dss-graphql
    build                 :
      dockerfile          : dss-graphql.dev.dockerfile
      context             : ${PWD}/dss-graphql
    image                 : dss-graphql
    volumes               :
                          - ${PWD}/dss-graphql:/dss-graphql
                          - /usr/local/bundle
    networks              :
                          - backend
    ports                 :
                          - 3016:3000
    tty                   : true
    stdin_open            : true
    depends_on            :
                          - postgresql
networks  :
  backend :
    driver: bridge

database.env содержит

POSTGRES_DB=devdb
PGUSER=postgres
PGPASSWORD=secret
POSTGRES_USER=postgres
POSTGRES_PASSWORD=secret
``

1 Ответ

0 голосов
/ 05 февраля 2020

Вы можете попытаться добавить раздел environment в свой контейнер dss-graphql и включить - PGPASSWORD: "secret"

Другой вариант - создать файл .pgpass и скопировать его в свой файл. dss-graphql container

Короче говоря, вы определяете имя пользователя / пароль в своем контейнере postgresql, но вы, похоже, не говорите контейнеру dss-graphql, как войти в базу данных, поэтому кажется, что вам нужно добавить это либо как 1) переменную окружения, 2) файл паролей (.pgpass), либо 3) параметр в некоторой конфигурации dss-graphql (с которым я не очень знаком - извините!)

Более подробную информацию о .pgpass можно найти в документации

...