我正在尝试设置一个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
他们都给我auth失败而不是抱怨没有用户数据库。
答案 0 :(得分:36)
我在这方面挣扎了一段时间并且没有接受回答的运气,我终于通过移除容器来实现它:
docker-compose rm postgres
然后音量:
docker volume rm myapp_postgres
然后,当我做了一个新的docker-compose up
时,我看到CREATE ROLE
飞过,我假设是初始up
上错过的。< / p>
关于postgres的Docker官方形象的Git回购,详细阐述了here的原因。
答案 1 :(得分:17)
您获得的身份验证错误会有很大帮助!
我用你的参数激发了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容器:
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容器连接到数据库?或者您的Web容器未使用&#39; db&#39;作为主机连接?您对Web容器的定义不包含我可以看到的任何错误。
答案 2 :(得分:6)
我有同样的问题,在我的情况下,问题是用一个命令解决的:
docker-compose up --force-recreate
答案 3 :(得分:5)
如果您使用的是 Docker 。
尝试检查您的本地数据库是否处于活动状态,因为它主要与Docker发生冲突,如果是,则可以将其停用或卸载以避免冲突。
答案 4 :(得分:2)
这对我有帮助
docker stop $(docker ps -qa) && docker system prune -af --volumes && docker compose up
答案 5 :(得分:1)
我有类似的情况。根据@Greg的回答,我做了一个 docker-compose up ,然后它选择了环境变量。
在此之前,我刚刚使用 docker-compose run 并且没有通过运行 docker-compose exec task env 来证明环境变量。奇怪的是, docker-compose run task env 显示了我期待的环境变量。
答案 6 :(得分:1)
感谢docker-compose exec containername env
的Bryan,我发现还需要删除卷。由于您需要知道docker-compose volume rm volumename
的确切名称,因此使用以下命令删除所有内容会更容易:
docker-compose down --volumes
答案 7 :(得分:0)
就我而言,在 Windows 10 postgres:13-alpine
中运行 WSL2
,上述解决方案均无法奏效。
我的错误是我使用的 docker network
名称与另一个项目共享。假设我有项目 A 和 B,都具有以下结构:
myappfolder
- docker-compose.yml
- services
- app
- depends on db
- db
默认情况下,docker-compose
会从 network
文件的父目录名称中获取 docker-compose.yml
名称。因此,A 和 B 两个项目都试图连接到同一个网络:myappfolder_default
。
解决这个问题:
确保网络名称在项目中是唯一的:
一个。要么将根文件夹的名称更改为唯一
B.或编辑您 docker-compose.yml
以设置显式网络名称
do docker-compose down -v
这将重置您在网络中定义的所有可能的数据库 > 确保在继续之前进行 psql 转储
做docker-compose up