当前位置: 首页 > 面试题库 >

Docker-compose环境变量

袁宜民
2023-03-14
问题内容

我正在尝试设置一个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容器连接到数据库?还是您的Web容器未将“
db”用作连接的主机?您对Web容器的定义不包含任何我可以看到的错误。



 类似资料:
  • 这个码头商。yml: 使用这个。env文件(它位于根文件夹中,如docker-compose.yml和Dockerfile): 和节点服务器启动中的以下代码: 我真的更喜欢使用第一种或第二种方法 docker版本:18.06.1-CE docker-compose版本:1.19.0

  • 问题内容: 使用v2,可以简单地设置环境变量: 完整文件为: 但是,如何转义不是纯字符串的环境变量? 我试过了: 错误:yaml.parser.ParserError:解析“ ./docker-compose.yml”第6行中的块映射时,预期第9列,但在“ ./docker-compose.yml”第6行中找到了“}”。第92栏 问题答案: 环境变量(包括姓名), 有单或双引号内被完全包裹 :或

  • 这是我的Docker-Compose:

  • 问题内容: 是否可以重用在多个容器之间共享的环境变量以避免重复,如本示例所示: 问题答案: 该选项可能是好的,但它不支持在撰写文件。其他走的方式是: 扩展名字段(撰写文件3.4+) 如果可以使用3.4+组成文件,则扩展名字段可能是最佳选择: docker-compose.yml env_file指令 docker-compose.yml variables.env * 项目根目录中的 *.env

  • 我猜这是因为它没有$app_vol_dir,但为什么会这样呢?如果docker compose扩展了另一个定义Environment:variables的compose文件

  • 我希望能够在docker compose中使用env变量。yml,值在docker compose up时传入。这就是一个例子。 我今天用基本的docker run命令来做这件事,它包含在我自己的脚本中。有没有一种方法可以在没有任何bash包装器的情况下用compose实现它?