使用共享 ARG 的 Docker Hub 多阶段构建上的"无法规范化任何内容"错误



我有一个多阶段构建,在各个阶段之间共享单个ARG(到DRY out路径(。类似这样的东西:

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"]

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

步骤4/9:WORKDIR$BUILD_DIR不能对进行任何规范化

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

事实证明,我需要在每一步都续订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"]

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

最新更新