Подтвердить что ты не робот

Переменные окружения для Docker

Я пытаюсь настроить контейнер postgres и хочу настроить учетную запись postgres с помощью:

POSTGRES_USER: docker
POSTGRES_PASSWORD: docker

Итак, я создал файл 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 следующим образом:

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

Все они дают мне ошибки аутентификации, а не жалобы, что нет базы данных пользователей.

4b9b3361

Ответ 1

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

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

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

Затем я выполнил команду:

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

затем запустил его с помощью docker-compose:

[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

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

[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" в качестве хоста для подключения? Ваше определение для веб-контейнера не содержит ошибок, которые я могу видеть.

Ответ 2

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

docker-compose rm postgres

И затем том:

docker volume rm myapp_postgres

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

Ответ 3

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

До этого я только что использовал docker-compose run, и он не собирал переменную окружения, как доказано, запустив docker-compose exec task env, Как ни странно, docker-compose run env показала переменную среды, которую я ожидал.

Ответ 4

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

docker-compose up --force-recreate