我试图将ENV_VAR
传递到一个容器,但是没有用。
version: '3.7'
services:
ubuntu:
image: ubuntu:latest
environment:
- ENV_VAR=teste
command: "echo ${ENV_VAR}"
使用$$
而非$
解决了问题:
version: '3.7'
services:
ubuntu:
image: ubuntu:latest
environment:
- ENV_VAR=teste
command: '/bin/sh -c "echo $$ENV_VAR"'
但是,我不明白为什么我必须调用sh
,而且我不相信图像中正在运行的应用程序能够读取该值。
答案 0 :(得分:2)
在运行时容器 中有一个变量,而docker-compose.yml
中的启动时间中有此变量是不同的。 Compose无法使用文件environment
部分中的变量替换配置文件中的变量-您正在command
部分中尝试这样做,但是您必须使用an .env
file来完成此操作工作。
或者像您一样,使用$$
语法阻止Compose to evaluate a variable,但让它在容器中执行被调用的Shell。
尽管environment
部分中的变量可用于容器。您可以通过以下最小示例进行检查:
version: "3.7"
services:
foo:
image: ubuntu
container_name: ubuntu
environment:
- foo=bar
command: sleep 3
nico@tuxedo:~/StackOverflow$ docker-compose up -d && docker exec ubuntu /bin/sh -c "env | grep foo"
Starting ubuntu ... done
foo=bar
因此,容器内的应用程序应该没有问题可以获取此变量。
对于为什么command: echo $$foo
完全不起作用的原因,我不确定。我相信,如果您将echo
用作ENTRYPOINT
(因为没有定义其他ENTRYPOINT
in the Dockerfile),那么启动容器时就不会有Shell,因为您会覆盖默认的/bin/bash
。当没有Shell被“包装”时,echo
本身似乎无法从环境中读取变量。尽管变量明显存在(使用commmand: env
和docker-compose up
进行检查),但是echo
不知道如何获取它们。
如果有人对此有很好的解释,我很高兴阅读它。 :)