dockerfile - 使用共享 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 中的硬编码路径更好的解决方法吗?
解决方案
事实证明,我需要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 自动构建器失败并显式出现错误。
推荐阅读
- amcharts - 删除 Multiple-Value-Axes amchart 的垂直标签轴
- sql - 返回由数组中的 jsonb 对象过滤的行
- makefile - CXXFLAGS 未附加在 makefile 中
- xcode - 在 Xcode 中启用自动签名需要 App Store Connect 中的什么用户角色?
- c# - 为什么关闭应用程序时线程不加入?
- c# - 为什么 TextBox.GetFirstCharIndexFromLine 总是返回 0?
- android - Bluetoothgatt.writecharacterstic 时发送的数据错误
- ios - Xcode 在编辑器中的构建时间很慢
- csv - 读取数据时出错,错误消息:无法将“1/31/2017”解析为从位置开始的字段的日期
- google-sheets - COUNTIFS 日期包含本月 - Google 表格