Heredocs 中对变量的处理不当(至少在使用 COPY 时)
作者: FoxCie创建于 2026年9月11日更新于 2026年9月11日
标签kind/bug
问题描述 处理 build args (以及可能的 env 变量) 在 heredoc COPY 指令中感觉非常奇怪,有时对我来说确实没有意义。 已经报告了与此相关的几个问题,例如 https://GitHub.com/podman-container-tools/buildah/issues/6048、 https://GitHub.com/podman-container-tools/buildah/issues/5422、 https://GitHub.com/podman-container-tools/buildah/issues/6044,但我没有找到任何关于真正困扰我的问题的内容。 我觉得 build 变量(以及可能的 env 变量,但对它们进行不同处理可能是有意义的)应该始终在 heredoc 中扩展,但并非如此。 运行包含 heredoc 的 shell 命令时,变量总是会被扩展,例如: sh export VAR="EXPANDED" cat <<EOF $VAR '$VAR' EOF 返回 "EXPANDED" 'EXPANDED'。 但是,在构建时做类似的事情时,它的行为非常奇怪: ARG VAR="EXPANDED" RUN <<EOF echo "VAR should be expanded: $VAR" echo 'VAR should also be expanded: $VAR' EOF 结果为: STEP 1/3: FROM alpine STEP 2/3: ARG VAR="EXPANDED" STEP 3/3: RUN <<EOF (echo "VAR should be expanded: $VAR"...) VAR should be expanded: EXPANDED VAR should also be expanded: $VAR COMMIT ... 同理,对于 COPY: ARG VAR="EXPANDED" COPY <<EOF /tmp/script.sh #!/bin/sh echo "VAR should be expanded: $VAR" echo 'VAR should also be expanded: $VAR' EOF RUN cat /tmp/script.sh #!/bin/sh echo "VAR should be expanded: EXPANDED" echo 'VAR should also be expanded: $VAR' COMMIT ... 我们可以观察到输出非常奇怪,因为变量扩展是根据 shell 规则进行的(在双引号中,但不是单引号中),但变量是一个构建变量,在运行时不存在,因此它应该在构建时始终由构建过程扩展。 我觉得这真的很意外,因为使用 Buildkit 构建相同的示例确实在所有地方扩展了变量,正如预期的那样。 ### 描述您收到的结果 我们可以观察到输出非常奇怪,因为变量扩展是根据 shell 规则进行的(在双引号中,但不是单引号中),但变量是一个构建变量,在运行时不存在,因此它应该在构建时始终由构建过程扩展。 我觉得这真的很意外,因为使用 Buildkit 构建相同的示例确实在所有地方扩展了变量,正如预期的那样。 要更进一步,我觉得应该有区别…
内容来源: podman-container-tools/buildah