Docker-compose env文件不起作用
Posted
技术标签:
【中文标题】Docker-compose env文件不起作用【英文标题】:Docker-compose env file not working 【发布时间】:2018-07-07 19:38:09 【问题描述】:我正在编写 docker-compose
文件来启动 mysql 实例,并希望使用 env 文件中的一些变量:这些文件实际上是这样的:
docker-compose.yml
version: '3.3'
services:
db:
image: mysql
restart: always
env_file:
- ./imran.env
environment:
MYSQL_ROOT_PASSWORD: $PASS
ports:
- $PORT1: $PORT2
imran.env
PASS=imran123
PORT1=3306
PORT2=3306
我得到以下错误,而不是正常工作:
WARNING: The PASS variable is not set. Defaulting to a blank string.
WARNING: The PORT2 variable is not set. Defaulting to a blank string.
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.db.ports contains unsupported option: '$PORT1
请帮忙
【问题讨论】:
【参考方案1】:您的docker-compose.yaml
文件中有一些问题:
答:
端口值之间的space
符号。它应该没有空格:
ports:
- $PORT1:$PORT2
乙:
您需要在docker-compose.yaml
所在的文件夹中使用.env 文件,以便为docker-compose.yaml
文件和docker 容器声明默认环境变量。 env_file
部分仅用于将值放入容器中。
因此,您应该执行以下操作:
1.
将带有 ENV 变量的文件重命名为 .env
:
mv imran.env .env
2.
在后面使用docker-compose.yaml
:
version: '3.3'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: $PASS
ports:
- $PORT1:$PORT2
【讨论】:
@imranahmedani 也许是接受答案的礼貌? 关于 env_file 选项的真正答案是什么,我可以在其中指定外部文件路径,它不起作用? 投反对票。不是正确答案。问题是关于如何明确指定环境文件。 > "env_file 部分仅用于将值放入容器中" / 这真是失败。他们应该已经创建了一个选项来为.env
文件指定自定义名称(和目录)...【参考方案2】:
当您在 env_file
后面添加 environment
时,它似乎被忽略了。根据我的经验,docker-compose 似乎有很多这样的“愚蠢”错误。
您的docker-compose.yaml
有一些与环境文件无关的错误。我稍微更正了一下。
$ tre
.
├── broken
│ ├── imran.env
│ └── docker-compose.yaml
└── works
├── docker-compose.yaml
└── imran.env
$ bat broken/*
───────┬──────────────────────────────────────────────
│ File: broken/docker-compose.yaml
───────┼──────────────────────────────────────────────
1 │ version: '3.3'
2 │ services:
3 │ db:
4 │ image: mysql
5 │ restart: always
6 │ env_file:
7 │ - ./imran.env
8 │ environment:
9 │ MYSQL_ROOT_PASSWORD: $PASS
───────┴──────────────────────────────────────────────
───────┬──────────────────────────────────────────────
│ File: broken/imran.env
───────┼──────────────────────────────────────────────
1 │ PASS=imran123
2 │ MYSQL_ROOT_PASSWORD=changeme
3 │ PORT1=3306
4 │ PORT2=3306
───────┴──────────────────────────────────────────────
$ diff broken works
diff broken/docker-compose.yaml works/docker-compose.yaml
8,9d7
< environment:
< MYSQL_ROOT_PASSWORD: $PASS
使用environment
,它会失败:
$ cd broken && docker-compose down && docker-compose up -d
WARNING: The PASS variable is not set. Defaulting to a blank string.
Stopping broken_db_1 ... done
Removing broken_db_1 ... done
Removing network broken_default
WARNING: The PASS variable is not set. Defaulting to a blank string.
Creating network "broken_default" with the default driver
Creating broken_db_1 ... done
但没有environment
,它可以工作:
$ cd works && docker-compose down && docker-compose up -d
Removing works_db_1 ... done
Removing network works_default
Creating network "works_default" with the default driver
Creating works_db_1 ... done
$ docker exec -i -t works_db_1 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=ac76b84ca072
TERM=xterm
PASS=imran123
MYSQL_ROOT_PASSWORD=changeme
PORT1=3306
PORT2=3306
GOSU_VERSION=1.12
MYSQL_MAJOR=8.0
MYSQL_VERSION=8.0.21-1debian10
HOME=/root
注意事项:
Docker-compose 显然不喜欢$PORT1
中的ports:
,你必须给出实际数字。 (在这种情况下,我只是将其删除,因为端口与 env 文件无关)
如果您不提供根通行证,MySQL 映像会崩溃。我添加了一个,以便容器可以运行足够长的时间,以便我转储其环境并确认正在设置变量。
我在 macOS Catalina 10.15.4
上使用 Docker 版本 19.03.5
。
【讨论】:
好像来自docs.docker.com/compose/environment-variables/#the-env-file。当你在多个文件中设置相同的环境变量时,这里是 Compose 用来选择使用哪个值的优先级:Compose 文件、Shell 环境变量、环境文件、Dockerfile、Variable is not defined 这是正确答案。【参考方案3】:我最近必须指定我希望我的容器使用 .env 作为其环境文件,例如:
version: '2.4'
services:
myapp:
build:
context: .
container_name: myapp01xj1
env_file:
- .env
【讨论】:
【参考方案4】:就我而言,我是从项目内的子目录运行docker-compose up
(错误地)。
因此,请确保docker-compose.yml
文件和.env
在同一个目录中,并且您在这两个文件所在的同一目录中运行docker-compose up
。
【讨论】:
以上是关于Docker-compose env文件不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Apollo 网关在 docker-compose 中不起作用
节点脚本可执行文件在 Mac 上不起作用:env: node\r: 没有这样的文件或目录
使用 NGINX 作为反向代理的 docker-compose 不起作用:/
.env 文件中的 MySQL 密码不起作用,但在 database.php 中工作正常(env() 缓存旧密码,config:clear 不会删除它)