别混淆.env
文件和env_file
选项!
它们有完全不同的用途!
.env
文件仅将环境变量传递给您的Docker Compose文件,然后可以传递给容器。
但env_file
选项仅将这些变量传递给容器,而不会传递给Docker Compose文件。
关于密钥的重要说明
该示例使用环境变量将秘密凭据传递给Docker Compose文件。在官方文档中详细解释了更好的加密和安全方法:如何在Docker Compose中使用密钥
示例
好的,假设我们有这个简单的compose文件:
```
services:
foo:
image: ubuntu
hostname: suchHostname # <-------------- 硬编码的'suchHostname'
volumes:
- /mnt/data/logs/muchLogs:/logs # <--- 硬编码的'muchLogs'
- /mnt/data/soBig:/data # <----------- 硬编码的'soBig'
```
我们不想再硬编码这些了!所以,我们可以将它们放在当前终端的环境变量中,并检查`docker-compose`是否能够理解它们:
```
$ export the_hostname="suchHostName"
$ export dir_logs="muchLogs"
$ export dir_data="soBig"
```
然后将`docker-compose.yml`文件更改为:
```
services:
foo:
image: ubuntu
hostname: $the_hostname # <-------------- 使用$the_hostname
volumes:
- /mnt/data/logs/$dir_logs:/logs # <--- 使用$dir_logs
- /mnt/data/$dir_data:/data # <-------- 使用$dir_data
```
现在让我们执行`docker-compose config`命令并检查输出结果:
```
name: tmp
services:
foo:
hostname: suchHostName # <------------- $the_hostname
image: ubuntu
networks:
default: null
volumes:
- type: bind
source: /mnt/data/logs/muchLogs # <--- $dir_logs
target: /logs
bind:
create_host_path: true
- type: bind
source: /mnt/data/soBig # <---------- $dir_data
target: /data
bind:
create_host_path: true
networks:
default:
name: tmp_default
```
好的,它起作用了!但是让我们使用`.env`文件代替。由于Docker Compose理解`.env`文件,让我们创建一个并进行设置:
```
# .env文件(与'docker-compose.yml'在同一目录中)
the_hostname="suchHostName"
dir_logs="muchLogs"
dir_data="soBig"
```
好的,您可以在一个
新的终端中测试它(这样我们使用`export`设置的旧环境变量不会干扰,并确保一切在一个干净的终端中工作)。只需再次按照第4步操作,看看它是否起作用!
到目前为止一切顺利。然而,当你遇到
env_file
选项时,会感到困惑。假设你想将密码传递给
Docker Compose文件(而不是容器)。
在错误的方法中,你可能会将密码放在
.secrets
文件中:
somepassword="0P3N$3$@M!"
然后按照以下方式更新Docker Compose文件:
services:
foo:
image: ubuntu
hostname: $the_hostname
volumes:
- /mnt/data/logs/$dir_logs:/logs
- /mnt/data/$dir_data:/data
env_file:
- .env
- .secrets
entrypoint: echo "Hush! This is a secret '$somepassword'"
现在再次像第4步一样检查它的结果会是:
WARN[0000] The "somepassword" variable is not set. Defaulting to a blank string.
name: tmp
services:
foo:
entrypoint:
- echo
- Hush! This is a secret ''
environment:
dir_data: soBig
dir_logs: muchLogs
somepassword: 0P3N$$3$$@M!
the_hostname: suchHostName
hostname: suchHostName
image: ubuntu
networks:
default: null
volumes:
- type: bind
source: /mnt/data/logs/muchLogs
target: /logs
bind:
create_host_path: true
- type: bind
source: /mnt/data/soBig
target: /data
bind:
create_host_path: true
networks:
default:
name: tmp_default
所以你可以看到,
$somepassord
变量只传递给了容器,而
没有传递给Docker Compose文件。
总结
你可以通过两种方式将环境变量传递给Docker Compose文件:
- 在运行docker compose之前将变量导出到终端。
- 将变量放在
.env
文件中。
env_file
选项只会将这些额外的变量传递给容器,而不是compose文件。
有用的链接