我试图设置一个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:postgres@db:5432/users postgres://postgres:docker@db:5432/users postgres://docker:docker@db:5432/users
你所得到的身份验证错误会帮助很多!
我用你的论点解雇了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
要模拟您的Web容器,我将运行另一个postgres容器实例并链接db容器,然后连接到db容器:
core@ku1 /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"
如果输入的密码不正确,我会收到验证错误。但是,如果我输入正确的密码:
core@ku1 /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启动它:
core@ku1 /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 core@ku1 /tmp/i $ bg
您可以看到创建了用户和密码。我执行:
core@ku1 /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" core@ku1 /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" core@ku1 /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
所以唯一可以想到的是你正在尝试从主机连接数据库,而不是Web容器?或者您的网络容器不使用’db’作为连接主机?您对Web容器的定义不包含任何可以看到的错误。
-G