2015-04-11 2 views
26

Я пытаюсь настроить контейнер Postgres и хотите настроить на Postgres Войти с помощью:Докер-Compose переменные среды

POSTGRES_USER: docker 
POSTGRES_PASSWORD: docker 

Так что я создал Докер-compose.yml как так

web: 
    build: . 
    ports: 
    - "62576:62576" 
    links: 
    - redis 
    - db 
db: 
    image: postgres 
    environment: 
    POSTGRES_PASSWORD: docker 
    POSTGRES_USER: docker 

redis: 
    image: redis 

Я также попытался другой синтаксис переменной окружения объявляя раздел дб как:

db: 
    image: postgres 
    environment: 
    - POSTGRES_PASSWORD=docker 
    - POSTGRES_USER=docker 

Однако Нейт эр из этих вариантов, кажется, работает, потому что по какой-то причине, когда я пытаюсь подключиться к базе данных Postgres, используя различные строки соединения:

postgres://postgres:[email protected]:5432/users 
postgres://postgres:[email protected]:5432/users 
postgres://docker:[email protected]:5432/users 

Все они дают мне AUTH неудачу в противоположности жаловаться нет базы данных пользователей.

+2

'@ db' подразумевает удаленное соединение и ничего не говорит о том что вы разрешили их в' postgresql.conf' и 'pg_hba.conf', особенно последний. Не имеет смысла не включать непосредственно сообщение об ошибке auth в этом вопросе. –

+1

У меня очень похожая проблема. Я сделал необходимые изменения в 'pg_hba.conf', чтобы разрешить удаленные подключения. Проблема заключается в том, что «docker-compose» игнорирует переменную окружения 'POSTGRES_PASSWORD' – jap1968

ответ

18

Ошибка авторизации, которую вы получили, поможет много!

Я разжег изображение Postgres с вашими аргументами:

docker run --name db -d -e POSTGRES_PASSWORD=docker -e POSTGRES_USER=docker postgres 

Тогда я exec'ed в:

docker exec -it db psql -U docker user 
psql: FATAL: database "user" does not exist 

Я получаю сообщение об ошибке вы ожидаете, потому что у меня есть доверие аутентификации:

docker exec -it db cat /var/lib/postgresql/data/pg_hba.conf | grep -v '^#' 

local all    all          trust 
host all    all    127.0.0.1/32   trust 
host all    all    ::1/128     trust 
host all all 0.0.0.0/0 md5 

Чтобы имитировать ваш веб-контейнер, я запустил еще один экземпляр контейнера postgres и свяжите контейнер db, а затем подключите его обратно к контейнеру db:

[email protected] /tmp/i $ docker run --rm --name web --link db:db -it postgres psql -h db -Udocker user 
Password for user docker: 
psql: FATAL: password authentication failed for user "docker" 

Я получаю ошибку аутентификации при вводе неправильного пароля. Но если я ввешу правильный пароль:

[email protected] /tmp/i $ docker run --rm --name web --link db:db -it postgres psql -h db -Udocker user 
Password for user docker: 
psql: FATAL: database "user" does not exist 

Все кажется, что работает правильно. Я положил все это в файл YAML и тестирование его таким образом, а также:

web: 
    image: postgres 
    command: sleep 999 
    ports: 
    - "62576:62576" 
    links: 
    - db 
db: 
    image: postgres 
    environment: 
    POSTGRES_PASSWORD: docker 
    POSTGRES_USER: docker 

затем обжигают его с Докер-композе:

[email protected] /tmp/i $ docker-compose -f dc.yaml up 
Creating i_db_1... 
Creating i_web_1... 
Attaching to i_db_1, i_web_1 
db_1 | ok 
db_1 | creating template1 database in /var/lib/postgresql/data/base/1 ... ok 
db_1 | initializing pg_authid ... ok 
db_1 | initializing dependencies ... ok 
db_1 | creating system views ... ok 
db_1 | loading system objects' descriptions ... ok 
db_1 | creating collations ... ok 
db_1 | creating conversions ... ok 
db_1 | creating dictionaries ... ok 
db_1 | setting privileges on built-in objects ... ok 
db_1 | creating information schema ... ok 
db_1 | loading PL/pgSQL server-side language ... ok 
db_1 | vacuuming database template1 ... ok 
db_1 | copying template1 to template0 ... ok 
db_1 | copying template1 to postgres ... ok 
db_1 | syncing data to disk ... ok 
db_1 | 
db_1 | WARNING: enabling "trust" authentication for local connections 
db_1 | You can change this by editing pg_hba.conf or using the option -A, or 
db_1 | --auth-local and --auth-host, the next time you run initdb. 
db_1 | 
db_1 | Success. You can now start the database server using: 
db_1 | 
db_1 |  postgres -D /var/lib/postgresql/data 
db_1 | or 
db_1 |  pg_ctl -D /var/lib/postgresql/data -l logfile start 
db_1 | 
db_1 | 
db_1 | PostgreSQL stand-alone backend 9.4.1 
db_1 | backend> statement: CREATE DATABASE "docker" ; 
db_1 | 
db_1 | backend> 
db_1 | 
db_1 | PostgreSQL stand-alone backend 9.4.1 
db_1 | backend> statement: CREATE USER "docker" WITH SUPERUSER PASSWORD 'docker' ; 
db_1 | 
db_1 | backend> 
db_1 | LOG: database system was shut down at 2015-04-12 22:01:12 UTC 
db_1 | LOG: database system is ready to accept connections 
db_1 | LOG: autovacuum launcher started 
^Z 
[1]+ Stopped     docker-compose -f dc.yaml up 
[email protected] /tmp/i $ bg 

вы можете увидеть, что имя пользователя и пароль были созданы. Я EXEC в:

[email protected] /tmp/i $ docker exec -it i_web_1 psql -Udocker -h db user 
Password for user docker: 
psql: FATAL: password authentication failed for user "docker" 
[email protected] /tmp/i $ 
db_1 | FATAL: password authentication failed for user "docker" 
db_1 | DETAIL: Connection matched pg_hba.conf line 95: "host all all 0.0.0.0/0 md5" 

[email protected] /tmp/i $ docker exec -it i_web_1 psql -Udocker -h db user 
Password for user docker: 
psql: FATAL: database "user" does not exist 
db_1 | FATAL: database "user" does not exist 

Так что единственное, что я могу думать о том, что вы пытаетесь подключиться к базе данных от хоста, а не веб-контейнера? Или ваш веб-контейнер не использует «db» в качестве хоста для подключения? Ваше определение для веб-контейнера не содержит ошибок, которые я вижу.

+6

Спасибо за вашу помощь, выясняется, что при создании образа впервые возникли проблемы с проверкой, которые я видел. Выполнение 'docker-compose rm', а затем' docker-compose up' фиксировало его – royalaid

+2

Мне пришлось сделать немного больше, чтобы получить работу от мин: 'docker stop $ (docker ps -a -q)', а затем 'docker rm $ (docker ps -a -q) ', за которым следует' docker rmi $ (docker images -q) ' – Rajiv

16

Я боролся с этим на некоторое время и не имея удачи с принятым ответ, я, наконец, получил его на работу, удалив контейнер:

docker-compose rm postgres 

а затем объем, а также:

docker volume rm myapp_postgres 

Затем, когда я сделал свежий docker-compose up я увидел CREATE ROLE пролетают, который я предполагая что было пропущено на начальном up.


Причины этого разрабатываются на here, на репо Git для официального изображения Docker для Postgres.

+2

, означает ли это, что переменные среды считываются только при первом запуске и игнорируются во всех последующих прогонах? Если это так, вероятно, было бы лучше оставить эти переменные и эти значения вручную после первого запуска. – wotanii

+0

Полностью работал для меня! –

+2

Да @wotanii кажется, что это и есть причина. Ваше понимание привело меня к [этой соответствующей проблеме] (https://github.com/docker-library/postgres/issues/41#issuecomment-167603905). Я также обновляю ответ, чтобы ссылаться на него. Благодаря! – dukedave

1

У меня была аналогичная ситуация. После ответа от @Greg я сделал доклер , составив, и он взял переменную окружения.

До этого я только использую Докер-Compose запустить и не поднимали переменное окружение, как доказано, запустив докер-компоновать Exec задачу окр. Странно, Задача запуска запуска док-станции env показала переменную окружения, которую я ожидал.

3

У меня была такая же проблема, и в моем случае проблема была решена с помощью одной команды:

docker-compose up --force-recreate 
Смежные вопросы