docker - 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
标签,但这是另一个问题)
问题
我们不明白:
- 第一个命令的构造方式和原因 (
/usr/bin/docker pull =build /usr/etc/app/server.js .
) - 第二个命令的构造方式和原因 (
/usr/bin/docker inspect =build /usr/etc/app/server.js .
) - docker 代理如何不识别 --from 子句,但仍然成功(并且正确)构建
- 为什么 docker 代理确实会警告无效的参考格式,然后继续正确识别每条指令。
顺便说一句,在构建 .NET 后端(使用类似的 dockerfile)时也会发生所有这些错误。
我们现在明白这个问题只发生在任务版本1.187.2
(或者0.187.2
,见下面的链接),而不是以前的版本1.181.0
(resp。0.181.0
)。
其他来源
关于这个问题,我们只能找到一个2018 年的旧问题线程,该线程已由 microsoft 存档。唯一的链接是通过 IP 地址,没有有效的证书。用户有完全相同的问题,但线程已关闭。有趣的是,次要版本号和补丁版本号与我们的系统相同。
解决方案
在寻找同一问题的答案时遇到了这个问题。在过去的几个小时里,我一直在研究 Docker 任务的源代码,我想我可以回答你的问题。
看来 Docker 任务试图解析 Dockerfile 以确定基本映像,并且任务中存在一个错误,它正在寻找FROM
其中的行,但错误地解析了行--from
中的COPY --from
行。
docker pull
然后它将基础图像传递docker inspect
给调用docker build
. 前两个命令失败,因为它们被传递垃圾,但第三个 ( docker build
) 正确读取 dockerfile 并且无论如何都会执行拉取,所以它成功了。
看起来这已在 2021 年 8 月 17 日修复,只解析以开头的行FROM
,所以我认为它很快就会进入 DevOps 代理。
推荐阅读
- angular - 订阅构造函数中的任务不起作用
- yaml - Yaml 中的三元运算符
- model - Razor Pages 和 DevExpress - 在一个单元格中显示多个图像
- node.js - 为什么我的 HTTP 获取请求给了我 403 错误?
- sql - 如果第二个表中也没有条目,则返回行?
- excel - 具有自动保存功能的 VBA 循环;代码将执行第一个实例,但在永久之后生成空白
- wordpress - Revolution Slider 6 中是否具有“Helper Grid”功能?
- elasticsearch - 在 ElasticSearch 中使用 multi_match 查询的奇怪结果
- javascript - 在按钮单击 ASP.NET MVC 时调用操作方法
- javascript - 从 JSON 中获取下拉列表的动态值