【发布时间】:2021-07-13 22:19:59
【问题描述】:
我有一个 Docker Compose 的游乐场项目,文件如下:
version: '3'
services:
mysql:
image: 'mysql:8'
container_name: '${PROJECT_NAME}_mysql'
hostname: '${PROJECT_NAME}_mysql'
networks:
- internal
ports:
- '127.0.0.1:${MYSQL_EXPOSE_PORT}:3306'
volumes:
- mysql:/var/lib/mysql
env_file:
- ./mysql/.env
environment:
MYSQL_EXPOSE_PORT: '${MYSQL_EXPOSE_PORT}'
MYSQL_ROOT_PASSWORD: '${MYSQL_ROOT_PASSWORD}'
MYSQL_USER: '${MYSQL_USER}'
MYSQL_PASSWORD: '${MYSQL_PASSWORD}'
volumes:
mysql:
networks:
internal:
我的./mysql/.env 是这个:
MYSQL_DATABASE=foobar
MYSQL_ROOT_PASSWORD=root
MYSQL_USER=web
MYSQL_PASSWORD=web
我的.env 文件如下所示:
COMPOSE_PROJECT_NAME=foobar
PROJECT_NAME=foobar
MYSQL_EXPOSE_PORT=33061
MYSQL_DATABASE=foobar
MYSQL_ROOT_PASSWORD=root
MYSQL_USER=web_override
MYSQL_PASSWORD=web_override
我在某处读到env_file 和environment 创建的变量将在容器本身中可用,而--env-file 提供在处理docker-composer.yml 文件期间可用的变量。
但是运行:
docker-compose -f docker-compose.yml --env-file .env up -d
对我来说会产生意想不到的行为。
-
如果我同时省略
env_file和environment配置,MySQL 将由于密码为空而无法启动。来自--env-file的变量将被忽略。这是否意味着MYSQL_ROOT_PASSWORD实际上是容器环境所必需的? -
如果我只输入
env_file,MySQL 会启动,但使用来自./mysql/.env的凭据。它会默默地忽略通过--env-file选项提供的 .env 文件 -
最后,如果我同时输入
env_file和environment,由于变量替换,它将尊重来自--env-file的值。但是执行到容器中并回显$MYSQL_ROOT_PASSWORD似乎很少丑陋,并尖叫着等待发生的安全漏洞。
在我看来,我对 Docker Compose 环境变量的工作方式存在根本性的误解。
有人可以澄清一下这些问题吗?
【问题讨论】:
标签: docker docker-compose environment-variables