VSTS 无法构建 Docker 镜像。

3

我有一个简单的 VS2017 web api,我正在尝试为它构建一个Docker镜像,并在VSTS上将该镜像发布到Azure容器注册表。但是它无法正常工作,错误如下:

2018-05-21T16:49:45.8481201Z Step 7/17 : COPY WebApi/WebApi.csproj WebApi/
2018-05-21T16:49:45.8503445Z COPY failed: stat /var/lib/docker/tmp/docker-builder936381234/WebApi/WebApi.csproj: no such file or directory
2018-05-21T16:49:45.8644972Z ##[error]COPY failed: stat /var/lib/docker/tmp/docker-builder936381234/WebApi/WebApi.csproj: no such file or directory
2018-05-21T16:49:45.8732546Z ##[error]/usr/local/bin/docker failed with return code: 1

这是一个标准的VS2017解决方案。

Dockerfile

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 63537
EXPOSE 44369

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY WebApi/WebApi.csproj WebApi/
RUN dotnet restore WebApi/WebApi.csproj
COPY . .
WORKDIR /src/WebApi
RUN dotnet build WebApi.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish WebApi.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebApi.dll"]

.dockerignore

.dockerignore
.env
.git
.gitignore
.vs
.vscode
docker-compose.yml
docker-compose.*.yml
*/bin
*/obj

docker-compose.yml

version: '3.4'

services:
  webapi:
    image: webapi
    build:
      context: .
      dockerfile: WebApi/Dockerfile

我已经尝试了所有建议的解决方案,包括更改.dockerignore文件、删除它等等。


COPY WebApi/WebApi.csproj WebApi/这行代码执行失败了,因为WebApi/WebApi.csproj文件不存在,请检查原因。 - user2915097
相同的配置在本地工作。 - Chirdeep Tomar
请注意,您将Dockerfile放置在哪个文件夹中或者在哪个文件夹中调用docker build命令是很重要的。 Docker将对该文件夹(以及所有子文件夹)进行快照,并将其转发给Docker守护程序进行处理。也就是说,您在Dockerfile中的路径必须是相对于您调用docker build命令的位置。 - Efrain
@ChirdeepTomar 你解决了这个问题吗? - starian chen-MSFT
@starianchen-MSFT,可以使用构建任务代理中的Docker Compose任务。 - Chirdeep Tomar
5个回答

10

它基于构建上下文来复制文件,默认情况下,Docker任务已勾选使用默认构建上下文选项,您需要取消此选项并指定相应的路径(与解决方案的同级目录),例如根目录可以使用.


这解决了我的问题。虽然我不确定为什么默认的构建上下文会导致路径不正确。谢谢。 - jimfromthegym - Jim Mackin
伙计!!!这个救了我好几个小时,因为我是Azure/容器的新手。太感谢了!!! - The_Butcher

3

我在Visual Studio 2019上也遇到了同样的问题,以下是解决方法:

  1. 删除Dockerfile文件;如果您进行了自定义,请将其复制到其他地方!
  2. 右键单击项目 -> 添加 -> Docker支持,这将生成一个新的docker文件。将您的自定义内容复制回去。
  3. 右键单击项目 -> 编辑项目文件。
  4. 找到此行:<DockerfileContext>.</DockerfileContext>并将其删除。

1
我刚刚完成了第四步,这解决了我的问题。谢谢您的帮助。 - Seb

0
我的问题是我有一个不必要的 Dockerfile,它位于子目录中。
由于 VSTS 默认搜索 Dockerfile 为 `**/Dockerfile`,因此使用了这个不必要的 Dockerfile,导致上下文错误。正确的 Dockerfile 被忽略了。

0

我之前使用的是构建任务代理中的 Docker 而不是 Docker Compose。改用 Docker Compose 并指向 Docker Compose 文件就解决了问题。


0

在compose文件中,您的context应该是 - context: ./WebApi

如其他答案所述,Docker构建以目录作为context,这是构建镜像所需内容的根目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接