$PATH
我对Docker 容器内环境变量的行为有些困惑。
- 我正在尝试将 $PATH 变量设置为
/kdb/bin
,加上一些其他值。 - 相反,变量的值
$PATH
似乎设置为与 Docker 容器主机系统相同的值
echo $PATH
主机上的值为:
$ echo $PATH
/usr/local/bin:/usr/bin:/bin
(另外还有一些我为了简洁而省略的内容。)
这是我的Dockerfile
:
FROM ubuntu:24.04
WORKDIR /kdb
ENV QHOME=/kdb
ENV PATH="${QHOME}/bin:${QHOME}:$PATH"
ENV QLIC=/kdb/kc.lic
COPY ./q q
COPY ./bin bin
COPY ./src src
CMD ["/bin/bash", "-c", "sleep infinity"]
和docker-compose.yml
services:
kdb:
container_name: kdb
build: .
command: echo $PATH
ports:
- 5000:5000
docker-compose.yml
我已将中的默认命令设置为echo $PATH
,以便的值PATH
将显示在日志中。
docker logs
表示容器内正在使用来自主机PATH
的相同值。容器变量不包含/kdb/bin
或/kdb
。
这是为什么呢?
因为Compose 在执行处理之前会替换环境变量引用。这在文件的其他部分更常用(例如替换图像标签或提供可配置的主机端口)。
这里的另一个复杂之处在于,与 Dockerfile 不同,Compose
command:
不会自动运行 shellCMD
。你需要自己提供一个 shell。因此你需要编写使用明确的
sh -c
包装器,并转义美元符号。不过,有一种更简单的方法可以做到这一点,尤其是在调试时。您可以
docker-compose run
根据 Compose 规范创建一个容器,但将command:
或 Dockerfile替换CMD
为您在命令行中输入的内容。然后,您可以删除
command:
Compose 文件中的覆盖。由于您可以根据需要轻松启动交互式 shell,因此还可以让 DockerfileCMD
运行您通常希望容器运行的内容,可能是类似这样的内容CMD ["kdb"]
;没有理由让容器运行毫无意义的sleep
命令。