Azure DevOps 管道 Dockerfile COPY --from 子句

Azure DevOps Pipeline Dockerfile COPY --from clause

问题

使用 Azure DevOps,我们使用 Dockerfile 来构建和静态服务 Angular 应用程序:

Docker 文件

FROM node:12-14-alpine AS build
WORKDIR /usr/etc/app
COPY *.json ./
RUN npm install
COPY . .
RUN npm run build -- -c stage

FROM node:alpine as runtime
WORKDIR /app
RUN yarn add express
COPY --from=build /usr/etc/app/dist/production ./dist
COPY --from=build /usr/etc/app/server.js .
ENV NODE_ENV=production
EXPOSE 8080
ENTRYPOINT ["node", "server.js"]

在本地,容器按预期生成。但是,运行 管道上的这个 docker 文件(或类似文件)给出以下输出:

管道输出

Starting: Build frontend image
==============================================================================
Task         : Docker
Description  : Build, tag, push, or run Docker images, or run a Docker command
Version      : 1.187.2
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/build/docker
==============================================================================
/usr/bin/docker pull =build /usr/etc/app/server.js .
invalid reference format
/usr/bin/docker inspect =build /usr/etc/app/server.js .
Error: No such object: =build /usr/etc/app/server.js .
[]
/usr/bin/docker build -f /home/***/YYY/app/myagent/_work/1/s/Frontend/Dockerfile --label com.azure.dev.image.system.teamfoundationcollectionuri=XXXX --label com.azure.dev.image.build.sourceversion=6440c30bb386************d370f2bc6387 --label com.azure.dev.image.system.teamfoundationcollectionuri=
Sending build context to Docker daemon  508.4kB

Step 1/18 : FROM node:12.14-alpine AS build
...
# normal build until finish, successful

(注意重复的 teamfoundationcollectionuri 标签,但这是 another issue

问题

我们不明白:

  1. 第一个命令的构造方式和原因 (/usr/bin/docker pull =build /usr/etc/app/server.js .)
  2. 第二个命令的构造方式和原因(/usr/bin/docker inspect =build /usr/etc/app/server.js .)
  3. docker 代理如何一开始不识别 --from 子句,但仍然成功(正确)构建
  4. 为什么 docker 代理会警告 无效的参考格式 但随后继续正确识别每条指令。

顺便说一句,所有这些错误也会在构建 .NET 后端时发生(使用类似的 docker 文件)。

我们现在确实了解到此问题只发生在任务版本 1.187.2(或 0.187.2,请参阅下面的 link),但不会发生在之前的 1.181.0(分别 0.181.0).

其他来源

关于此问题,我们所能找到的只是一个旧的 issue thread from 2018,已被 Microsoft 存档。唯一的 link 是通过 IP 地址,没有有效的证书。用户有完全相同的问题,但线程已关闭。有趣的是,次版本号和补丁版本号与我们的系统相同。

在搜索同一问题的答案时遇到了这个问题。我花了最后几个小时挖掘 Docker 任务的源代码,我想我可以回答你的问题。

似乎 Docker 任务试图解析 Docker 文件以确定基本图像,并且在任务中存在一个错误,它正在寻找带有 FROM,但错误地解析了 COPY --from 行中的 --from

然后在调用 docker build 之前将该基本图像传递给 docker pulldocker inspect。前两个命令失败,因为它们被传递为垃圾,但第三个 (docker build) 正确读取 dockerfile 并执行拉动,所以它成功了。

看起来这是 fixed on 2021-08-17 只解析 开始 FROM 的行,所以我认为它很快就会进入 DevOps 代理。