首页 > 解决方案 > 使用共享 ARG 的 Docker Hub 多阶段构建上的“无法正常化任何内容”错误

问题描述

我在阶段之间有一个多阶段构建共享单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"]

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

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

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

标签: dockerfiledockerhub

解决方案


事实证明,我需要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 自动构建器失败并显式出现错误。


推荐阅读