我对 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
显示容器内正在使用来自 host 的相同值。容器 PATH
变量不包括 /kdb/bin
或 /kdb
。
这是为什么?
因为 Compose 在进行处理之前会替换环境变量引用。 这在文件的其他部分更常用(例如替换图像标签或提供可配置的主机端口)。
这里的另一个复杂之处是 Composecommand:
不会自动运行 shell,与 Dockerfile
CMD
不同。 你需要自己提供一个shell。 所以你需要写
command: sh -c 'echo $$PATH'
使用明确的 sh -c
包装器,并转义美元符号。
command:
或 Dockerfile
CMD
替换为您在命令行中输入的内容。
docker-compose run kdb sh -c 'echo $PATH'
然后您可以删除 Compose 文件中的 command:
覆盖。 由于如果需要,您可以轻松启动交互式 shell,因此还可以让 Dockerfile
CMD
运行您通常希望容器运行的内容,可能类似于
CMD ["kdb"]
;没有理由让容器运行无意义的
sleep
命令。