Dockerfile 设置 ENV PATH 导致主机 PATH 中的值在容器内使用

问题描述 投票:0回答:1

我对 Docker 容器内环境变量

$PATH
的行为有些困惑。

  • 我正在尝试将 $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

这是为什么?

docker docker-compose environment-variables
1个回答
0
投票

因为 Compose 在进行处理之前会替换环境变量引用。 这在文件的其他部分更常用(例如替换图像标签或提供可配置的主机端口)。

这里的另一个复杂之处是 Compose

command:

 不会自动运行 shell,与 Dockerfile 
CMD
 不同。  你需要自己提供一个shell。  所以你需要写

command: sh -c 'echo $$PATH'
使用明确的 

sh -c

 包装器,并转义美元符号。


不过,有一种更简单的方法可以做到这一点,尤其是在调试时。 您可以

docker-compose run

 基于 Compose 规范的容器,但将 command:
 或 Dockerfile 
CMD
 替换为您在命令行中输入的内容。

docker-compose run kdb sh -c 'echo $PATH'
然后您可以删除 Compose 文件中的 

command:

 覆盖。  由于如果需要,您可以轻松启动交互式 shell,因此还可以让 Dockerfile 
CMD
 运行您通常希望容器运行的内容,可能类似于 
CMD ["kdb"]
;没有理由让容器运行无意义的 
sleep
 命令。

© www.soinside.com 2019 - 2024. All rights reserved.