我正在将docker-compose
文件写入MySQL实例,并希望使用env文件中的少量变量:这里的文件实际上是这样的:
搬运工-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}
请帮助
答案 0 :(得分:7)
您的docker-compose.yaml
文件中存在一些问题:
答强>
端口值之间的space
符号。它应该没有空格:
ports:
- ${PORT1}:${PORT2}
<强> B:强>
您需要在docker-compose.yaml
所在的文件夹中使用.env文件,以便为docker-compose.yaml
文件和泊坞窗容器声明默认环境变量。 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}
答案 1 :(得分:1)
在您添加env_file
之后,似乎environment
被忽略了。以我的经验,docker-compose似乎有许多这样的“傻”错误。
您的docker-compose.yaml
有一些与env文件无关的错误。我纠正了一下。
$ 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
注意:
${PORT1}
中的ports:
,您必须提供实际的数字。 (在这种情况下,我只是删除了它,因为端口与env文件无关)19.03.5
上使用Docker版本10.15.4
。答案 2 :(得分:0)
我最近不得不指定我希望我的容器使用 .env 作为其环境文件,例如:
version: '2.4'
services:
myapp:
build:
context: .
container_name: myapp01xj1
env_file:
- .env