Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Docker编写环境变量_Postgresql_Docker_Docker Compose - Fatal编程技术网

Postgresql Docker编写环境变量

Postgresql Docker编写环境变量,postgresql,docker,docker-compose,Postgresql,Docker,Docker Compose,我正在尝试设置postgres容器,并希望使用以下内容设置postgres登录: POSTGRES_USER: docker POSTGRES_PASSWORD: docker 因此,我创建了docker-compose.yml,如下所示 web: build: . ports: - "62576:62576" links: - redis - db db: image: postgres environment: POSTGRES_PASSWO

我正在尝试设置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"
docker-compose rm postgres
如果输入的密码不正确,则会出现身份验证错误。但是,如果我输入了正确的密码:

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容器未使用“db”作为要连接的主机?您对web容器的定义不包含我可以看到的任何错误。

我对此进行了一段时间的努力,但没有找到可接受的答案,我最终通过删除容器使其正常工作:

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"
docker-compose rm postgres
然后是音量

docker volume rm myapp_postgres
然后,当我做了一个新的
docker组合
时,我看到
创建角色
飞过去了,我假设这就是最初的
up
中遗漏的内容



原因在博士后Docker官方形象的Git回购协议中详细阐述。

我也有类似的情况。根据@Greg的回答,我做了一个docker compose,它提取了环境变量


在此之前,我刚刚使用了docker compose run,但它没有像运行docker compose exec task env所证明的那样拾取环境变量。奇怪的是,docker compose run task env显示了我期望的环境变量。

我也遇到了同样的问题,在我的例子中,问题通过一个命令得到了解决:

docker-compose up --force-recreate

如果您使用的是Docker


尝试检查您的本地数据库是否处于活动状态,因为它主要与Docker冲突,如果是,您可以将其停用或卸载以避免冲突。

感谢Bryan与Docker compose exec containername env的合作,我发现还需要删除卷。由于对于
docker compose卷rm volumename
,您需要知道确切的名称,因此只需使用以下选项即可轻松删除所有卷:

docker-compose down --volumes
这对我有帮助

docker-stop$(docker-ps-qa)和docker-system-prune-af——卷和docker-compose-up

@db
意味着远程连接,并且没有任何迹象表明您在
postgresql.conf
pg_hba.conf
中允许它们,尤其是最后一个。在这个问题中不直接包含auth错误消息是没有意义的。我遇到了一个非常类似的问题。我已经在
pg_hba.conf
中做了必要的更改,以允许远程连接。问题似乎是
docker compose
忽略了环境变量
POSTGRES_PASSWORD
感谢您的帮助,结果是在第一次创建映像时发生了一些奇怪的事情,导致了我看到的身份验证问题。执行
docker compose rm
,然后执行
docker compose up
修复,这是否意味着环境变量仅在第一次运行时读取,在所有后续运行时被忽略?如果是这样的话,最好在第一次runYes@wotanii之后手动删除这些变量和值,这似乎就是原因所在。你的洞察力使我明白了。我会更新答案以引用它。谢谢哇,非常感谢你@dukedave。你的回答让我很开心!在找到这个答案之前花了一天多的时间。非常感谢。我浪费了这么多时间,只为了
docker compose rm
解决它。。。。就像Drupal clear cache一样,两次……天哪,我已经有3名工程师在这工作了整整一天,试图找出问题所在。然后有人指出了这个评论。原来很多年前有人安装了本地postgres进行测试,我们试图连接到错误的postgres-u-。杀死了windows服务,现在就像一个符咒。非常感谢。很高兴听到这个消息helped@FatalCatharsis我觉得你感谢AbdelI浪费了一整天直到我看到这个。谢谢。我想Docker日志没有显示任何失败的登录尝试,我真希望我能投票两次。我已经公开了一个不同的端口,可以让两个实例同时运行-谢谢!