AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79368709
Accepted
user2138149
user2138149
Asked: 2025-01-19 17:36:44 +0800 CST2025-01-19 17:36:44 +0800 CST 2025-01-19 17:36:44 +0800 CST

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

  • 772

$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。

这是为什么呢?

docker
  • 1 1 个回答
  • 36 Views

1 个回答

  • Voted
  1. Best Answer
    David Maze
    2025-01-19T19:30:48+08:002025-01-19T19:30:48+08:00

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

    这里的另一个复杂之处在于,与 Dockerfile 不同,Composecommand:不会自动运行 shell CMD。你需要自己提供一个 shell。因此你需要编写

    command: sh -c 'echo $$PATH'
    

    使用明确的sh -c包装器,并转义美元符号。


    不过,有一种更简单的方法可以做到这一点,尤其是在调试时。您可以docker-compose run根据 Compose 规范创建一个容器,但将command:或 Dockerfile替换CMD为您在命令行中输入的内容。

    docker compose run kdb sh -c 'echo $PATH'
    

    然后,您可以删除command:Compose 文件中的覆盖。由于您可以根据需要轻松启动交互式 shell,因此还可以让 DockerfileCMD运行您通常希望容器运行的内容,可能是类似这样的内容CMD ["kdb"];没有理由让容器运行毫无意义的sleep命令。

    • 2

相关问题

  • 如何更新 Docker 基础镜像的权限?

  • Docker 构建:/make:权限被拒绝

  • VSCode 运行旧容器时出现问题

  • Docker 绑定()到 0.0.0.0:3000 失败

  • 如何追踪“docker scout cves”显示的漏洞来源

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve