docker用美元组成.env文件值:在MAC中插入,但在Linux中不插入



test.yml

version: "3.1"
services:
test:
container_name: test
image: alpine
environment:
var: $test_variable
entrypoint: /bin/sh -c
command: [ "echo $$var" ]

test.env

test_variable=TE$T_VALUE3

命令

docker-compose -f test.yml --env-file test.env up

输出[Linux]

Starting test ... done
Attaching to test
test    | TE$T_VALUE3
test exited with code 0

输出[MacOS]

WARN[0000] The “T_VALUE3” variable is not set. Defaulting to a blank string.
WARN[0000] The “T_VALUE3" variable is not set. Defaulting to a blank string.
WARN[0000] The “T_VALUE3” variable is not set. Defaulting to a blank string.
[+] Running 2/2
:heavy_check_mark: test 1 layers [⣿]      0B/0B      Pulled                                                                  3.4s
:heavy_check_mark: c41833b44d91 Pull complete                                                                              0.8s
[+] Running 2/0
:heavy_check_mark: Network test_default  Created                                                                             0.0s
:heavy_check_mark: Container test        Created                                                                             0.0s
Attaching to test
test  | TE
test exited with code 0

潜在相关:https://github.com/docker/compose/issues/10419


为什么不一致?感觉就像Mac上的docker compose在处理之前将.env文件加载到test.yml(compose配置)中。

这是一个已知的问题吗?如何绕过它并制作跨平台的env文件?

对值进行报价也有不同的工作方式:在Linux上,值会按原样加载,即使用引号,在Mac上,它加载时不带引号,但也不带$interpolation(即在Linux上加载时相同,不带引号)。因此,引用也不是跨平台方法的一种选择。。。

我在.env文件中找不到任何讨论这种不一致性或$插值规则的参考文献。


编辑1

linux$ docker-compose -f test.yml --env-file test.env config
services:
test:
command:
- echo $$var
container_name: test
entrypoint: /bin/sh -c
environment:
var: TE$$$$T_VALUE3
image: alpine
version: '3.1'
macos$ docker-compose -f test.yml --env-file test.env config
name: test
services:
test:
command:
- echo $$var
container_name: test
entrypoint:
- /bin/sh
- -c
environment:
var: TE
image: alpine
networks:
default: null
networks:
default:
name: test_default

编辑2[将Linux上的docker compose更新到最新版本;结果相同]:

linux$ docker-compose --env-file test.env -f test.yml up
[+] Running 1/0
✔ Container test  Recreated                                               0.0s 
Attaching to test
test  | TE$T_VALUE3
test exited with code 0
linux$
linux$ docker-compose --env-file test.env -f test.yml config
name: playground
services:
test:
command:
- echo $$var
container_name: test
entrypoint:
- /bin/sh
- -c
environment:
var: TE$$T_VALUE3
image: alpine
networks:
default: null
networks:
default:
name: playground_default
linux$
linux$ docker-compose --version
Docker Compose version v2.17.2

至少现在报价不再将报价视为价值的一部分:

linux$ docker-compose --env-file test.env -f test.yml up
[+] Running 1/0
✔ Container test  Recreated                                               0.0s 
Attaching to test
test  | TE$T_VALUE3
test exited with code 0
linux$
linux$ cat test.env 
test_variable='TE$T_VALUE3'

MacOS docker编写版本:

Docker Compose version 2.17.0

尽管如此,在未引用的值中插入$的不一致性仍然存在

为了防止在dot.env文件值上进行插值,您必须用单引号括起来:

$ cat .env 
KEY='$2a$10$bY3ZpvQN/nTFHFSZjaZg1On50ueeibFctofVzk4uQu8gXPdkkyVZO'
$ cat compose.yaml 
services:
foo:
image: alpine
env_file:
- .env
$ docker compose run foo | grep KEY
KEY=$2a$10$bY3ZpvQN/nTFHFSZjaZg1On50ueeibFctofVzk4uQu8gXPdkkyVZO

为什么不一致?

基于输出格式,您的Linux安装运行Docker Compose v1(即将成为EoL)

最新更新