我试图让一个docker-compose文件使用多个.env
文件,而且我没有运气。我尝试设置三个.env
文件:
我的docker-compose.yml
文件如下所示:
version: '2'
services:
db:
env_file:
- ./.env
- ./.env.${ENV}
- ./.env.local
image: postgres
ports:
- ${POSTGRES_PORT}:5432
.env
看起来像这样:
POSTGRES_USER=myapp
并且.env.development
看起来像这样:
POSTGRES_PASSWORD=supersecretpassword
POSTGRES_HOST=localhost
POSTGRES_PORT=25432
POSTGRES_DB=myapp_development
.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]
从该错误消息中,看起来我的环境变量都没有被使用。我刚刚升级到最新的可用docker-compose - 同样的错误:
$ docker-compose --version
docker-compose version 1.8.0-rc1, build 9bf6bc6
这里有什么想法吗?如果能够在多个环境中使用单个docker-compose.yml
,那将会很不错。
答案 0 :(得分:6)
请记住,您有两种不同的环境来定义变量。执行docker-compose命令的主机和容器本身(在您的情况下运行db服务)。
您的docker-compose.yml
文件可以访问您主机的环境变量。因此ENV
可以从docker-compose
命令访问.env
,但ENV
文件中没有{。}}。
相反,容器内部无法访问.env
的值,但db
文件中定义的所有变量都将为。
我不知道您是否真的需要.env.development
容器来访问POSTGRES_PORT
上定义的变量。但至少看起来您的主机需要拥有该文件的内容,因此在调用docker-compose命令时,会定义#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.
变量。
要解决您的特定问题,您还需要在主机上定义环境变量,而不仅仅是容器。你可以这样做:
@font-face {
font-family: "Dense-Regular";
src: url("Dense-Regular.otf");
}
希望有所帮助。
答案 1 :(得分:2)
为了根据运行环境(例如开发/登台/生产)应用不同/多个env_file,我认为用于docker-compose的更好方法是使用多个docker-compose yml文件。
例如:
docker-compose.yml
web:
image: example/my_web_app:latest
env_file:
- .env
docker-compose.override.yml
web:
build: .
volumes:
- '.:/code'
ports:
- 8883:80
env_file:
- .env.dev
运行docker-compose up
时,它会自动读取覆盖。
docker-compose.prod.yml
web:
ports:
- 80:80
env_file:
- .env.prod
要使用此生产Compose文件进行部署,可以运行
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
我的Docker版本:
$ docker -v
Docker version 18.06.1-ce, build e68fc7a
$ docker-compose -v
docker-compose version 1.22.0, build f46880fe
答案 2 :(得分:0)
阅读此页面时:https://docs.docker.com/compose/environment-variables/
根据我的理解,您应该执行以下操作:
对于全局变量(不应该更改)创建一个如下的env文件:
{key:value}
和其他(可能会改变)你应该在docker-compose.yml的环境下添加他们的名字,如下所示:
VAR1=VALUE1
VAR2=VALUE2
这将从正在运行docker-compose的shell中获取VAR1和VAR2值。
我希望这会有所帮助。
答案 3 :(得分:0)
关于docker-compose.yml中的.env文件和env_file选项存在误解,因为它非常模棱两可。 Shin在github问题docker-compose doesn't use env_file中很好地指出了这一点。我只引用他的摘要:
docker-compose.yml文件中的变量替换将从外壳环境和.env文件中拉出(按优先级降序排列)。
容器中可用的变量是在env_file文件中找到的值与服务的“环境”部分中描述的值的组合。
这些是两组完全独立的功能。