首页 > 解决方案 > Azure DevOps Pipeline Dockerfile COPY --from 子句

问题描述

问题

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

Dockerfile

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

在本地,容器按预期构建。但是,在管道上运行这个 dockerfile(或类似的)会给出以下输出:

管道输出

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标签,但这是另一个问题

问题

我们不明白:

  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 后端(使用类似的 dockerfile)时也会发生所有这些错误。

我们现在明白这个问题只发生在任务版本1.187.2(或者0.187.2,见下面的链接),而不是以前的版本1.181.0(resp。0.181.0)。

其他来源

关于这个问题,我们只能找到一个2018 年的旧问题线程,该线程已由 microsoft 存档。唯一的链接是通过 IP 地址,没有有效的证书。用户有完全相同的问题,但线程已关闭。有趣的是,次要版本号和补丁版本号与我们的系统相同。

标签: dockerazure-devopsdockerfileazure-task-groups

解决方案


在寻找同一问题的答案时遇到了这个问题。在过去的几个小时里,我一直在研究 Docker 任务的源代码,我想我可以回答你的问题。

看来 Docker 任务试图解析 Dockerfile 以确定基本映像,并且任务中存在一个错误,它正在寻找FROM其中的行,但错误地解析了行--from中的COPY --from行。

docker pull然后它将基础图像传递docker inspect给调用docker build. 前两个命令失败,因为它们被传递垃圾,但第三个 ( docker build) 正确读取 dockerfile 并且无论如何都会执行拉取,所以它成功了。

看起来这已在 2021 年 8 月 17 日修复,只解析以开头的行FROM,所以我认为它很快就会进入 DevOps 代理。


推荐阅读