使用共享 ARG 的 Docker Hub 多阶段构建出现“无法标准化任何内容”错误

Kir*_*ill 5 dockerhub dockerfile

我有一个多阶段构建,ARG在阶段之间共享单个(干燥路径)。像这样的东西:

ARG BUILD_DIR=/build

FROM alpine:latest as build
RUN apk add --no-cache gcc musl-dev
WORKDIR $BUILD_DIR
RUN echo -e '\n\
#include <stdio.h>\n\
int main (void)\n\
{ puts ("Hello, World!");}'\
>> hello.c
RUN cc -o hello hello.c

FROM alpine:latest
COPY --from=build $BUILD_DIR/hello /app
CMD ["/app"]
Run Code Online (Sandbox Code Playgroud)

它在本地构建没有问题,但自动 Docker Hub 构建失败并出现以下错误:

步骤 4/9:WORKDIR $BUILD_DIR 无法标准化任何内容

我很好奇,什么会导致这个问题(Docker Hub 上的构建引擎太旧?)。除了在 Dockerfile 中硬编码路径之外,还有更好的解决方法吗?

Kir*_*ill 11

事实证明,我需要ARG在想要重用它的每个步骤上进行更新。引用文档:

指令ARG在定义它的构建阶段结束时超出范围。要在多个阶段中使用 arg,每个阶段都必须包含该ARG指令。

固定的Dockerfile是:

ARG BUILD_DIR=/build

FROM alpine:latest as build
ARG BUILD_DIR # <----------------------------------
RUN apk add --no-cache gcc musl-dev
WORKDIR $BUILD_DIR
RUN echo -e '\n\
#include <stdio.h>\n\
int main (void)\n\
{ puts ("Hello, World!");}'\
>> hello.c
RUN cc -o hello hello.c

FROM alpine:latest
ARG BUILD_DIR # <----------------------------------
COPY --from=build $BUILD_DIR/hello /app
CMD ["/app"]
Run Code Online (Sandbox Code Playgroud)

这意味着ARG我最初的问题中的代码中的值甚至不起作用。有趣的是,我的 Docker For Mac 忽略了这个问题,并默默地使用空BUILD_DIR参数来WORKDIR生成成功的构建。虽然 Docker Hub 自动构建器失败并明确显示错误。