mat*_*att 14 docker docker-compose
我试图让一个docker-compose文件处理多个.env文件,我没有运气.我正在尝试设置三个.env文件:
我的docker-compose.yml文件看起来像这样:
version: '2'
services:
db:
env_file:
- ./.env
- ./.env.${ENV}
- ./.env.local
image: postgres
ports:
- ${POSTGRES_PORT}:5432
Run Code Online (Sandbox Code Playgroud)
.env 看起来像这样:
POSTGRES_USER=myapp
Run Code Online (Sandbox Code Playgroud)
和.env.development看起来像这样:
POSTGRES_PASSWORD=supersecretpassword
POSTGRES_HOST=localhost
POSTGRES_PORT=25432
POSTGRES_DB=myapp_development
Run Code Online (Sandbox Code Playgroud)
.env.local 在这种情况下不存在.
运行后ENV=development docker-compose up,我收到以下输出:
$ ENV=development docker-compose up
WARNING: The POSTGRES_PASSWORD variable is not set. Defaulting to a blank string.
WARNING: The POSTGRES_DB variable is not set. Defaulting to a blank string.
WARNING: The POSTGRES_PORT variable is not set. Defaulting to a blank string.
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.db.ports is invalid: Invalid port ":5432", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
Run Code Online (Sandbox Code Playgroud)
从该错误消息,看起来我的环境变量都没有被使用.我刚刚升级到最新的可用docker-compose - 同样的错误:
$ docker-compose --version
docker-compose version 1.8.0-rc1, build 9bf6bc6
Run Code Online (Sandbox Code Playgroud)
这里有什么想法?如果有一个docker-compose.yml可以在多个环境中工作的单一会很好.
关于 docker-compose.yml 中的 .env 文件和 env_file 选项存在误解,因为它非常不明确。Shin在 github 问题docker-compose does not use env_file中很好地指出了这一点。我直接引用他的总结:
docker-compose.yml 文件中的变量替换将从 shell 环境和 .env 文件中提取(按优先级降序)。
容器中可用的变量是 env_file 文件中找到的值和服务的环境部分中描述的值的组合。
这是两组完全独立的功能。
小智 6
请记住,在两种不同的环境中定义变量。您要在其中执行docker-compose命令的主机以及容器本身(在您的情况下运行db服务)。
您的docker-compose.yml文件可以访问主机的环境变量。因此ENV可以从docker-compose命令访问,但不能在.env文件中访问。
相反,ENV容器内无法获得for的值,但是.env文件中定义的所有变量都可以。
我不知道您是否真的需要db容器来访问您的上定义的变量.env.development。但至少看来您的主机需要该文件的内容,因此,在调用docker-compose命令时,将POSTGRES_PORT定义变量。
要解决您的特定问题,您不仅需要为容器,还需要在主机上定义环境变量。您可以执行以下操作:
#Set for host
ENV=development
#Also sets the variables on the host
source ./.env.$ENV
#POSTGRES_PORT defined in .env.development is used here
docker-compose up
#since env_file also contains .env.development, the variables will be reachable from the container.
Run Code Online (Sandbox Code Playgroud)
希望能有所帮助。
为了根据运行环境(例如开发/登台/生产)应用不同/多个env_files,我认为docker-compose的一种更好方法是使用多个docker-compose yml文件。
例如:
docker-compose.yml
web:
image: example/my_web_app:latest
env_file:
- .env
Run Code Online (Sandbox Code Playgroud)
docker-compose.override.yml
web:
build: .
volumes:
- '.:/code'
ports:
- 8883:80
env_file:
- .env.dev
Run Code Online (Sandbox Code Playgroud)
运行时,docker-compose up它将自动读取覆盖。
docker-compose.prod.yml
web:
ports:
- 80:80
env_file:
- .env.prod
Run Code Online (Sandbox Code Playgroud)
要使用此生产Compose文件进行部署,您可以运行
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
Run Code Online (Sandbox Code Playgroud)
我的Docker版本:
$ docker -v
Docker version 18.06.1-ce, build e68fc7a
$ docker-compose -v
docker-compose version 1.22.0, build f46880fe
Run Code Online (Sandbox Code Playgroud)
参考:https : //docs.docker.com/compose/extends/
Dim*_*elu -2
阅读此页面时:https://docs.docker.com/compose/environment-variables/
根据我的理解,你应该执行以下操作:
对于全局变量(不应更改),创建一个 env 文件,如下所示:
VAR1=VALUE1
VAR2=VALUE2
Run Code Online (Sandbox Code Playgroud)
对于其他人(可能会改变),您应该在 docker-compose.yml 的环境下添加它们的名称,如下所示:
environment:
- VAR1
- VAR2
Run Code Online (Sandbox Code Playgroud)
这将从运行 docker-compose 的 shell 中获取 VAR1 和 VAR2 值。
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
8399 次 |
| 最近记录: |