基于VSTS的Docker编写

基于VSTS的Docker编写,docker,.net-core,azure-devops,Docker,.net Core,Azure Devops,我有一个.net核心应用程序,我想在docker上运行。 我使用VS Docker工具“添加容器支持”,它添加了一个Docker compose项目 当我构建它时,我使用重新编译的.net核心应用程序和dockerfile来构建容器 这是docker compose.dcproj的 <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="15.0" Sdk="Microsoft.Docker.Sdk">

我有一个.net核心应用程序,我想在docker上运行。 我使用VS Docker工具“添加容器支持”,它添加了一个
Docker compose
项目

当我构建它时,我使用重新编译的.net核心应用程序和dockerfile来构建容器

这是docker compose.dcproj的

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" Sdk="Microsoft.Docker.Sdk">
  <PropertyGroup Label="Globals">
    <ProjectVersion>2.0</ProjectVersion>
    <DockerTargetOS>Linux</DockerTargetOS>
    <ProjectGuid>a7cb971b-57ac-4704-851d-a322cf4f9e3f</ProjectGuid>
  </PropertyGroup>
  <ItemGroup>
    <None Include="docker-compose.ci.build.yml" />
    <None Include="docker-compose.override.yml">
      <DependentUpon>docker-compose.yml</DependentUpon>
    </None>
    <None Include="docker-compose.yml" />
  </ItemGroup>
</Project>
docker compose.override.yml

version: '3'

services:
  coresandbox:
    image: coresandbox
    build:
      context: ./CoreSandbox
      dockerfile: Dockerfile
version: '3'
version: '3'

services:
  ci-build:
    image: microsoft/aspnetcore-build:2.0
    volumes:
      - .:/src
    working_dir: /src
    command: /bin/bash -c "dotnet restore ./CoreSandbox.sln && dotnet publish ./CoreSandbox.sln -c Release -o ./obj/Docker/publish"
docker compose.ci.build.yml

version: '3'

services:
  coresandbox:
    image: coresandbox
    build:
      context: ./CoreSandbox
      dockerfile: Dockerfile
version: '3'
version: '3'

services:
  ci-build:
    image: microsoft/aspnetcore-build:2.0
    volumes:
      - .:/src
    working_dir: /src
    command: /bin/bash -c "dotnet restore ./CoreSandbox.sln && dotnet publish ./CoreSandbox.sln -c Release -o ./obj/Docker/publish"
现在,我已经为VST配置了以下任务: 1.获取来源 2.构建服务-Docker Compose 任务看起来相当基本,我保留了所有默认设置

然后我从构建中得到这个日志

/usr/local/bin/docker-compose -f /home/alex/testagent/_work/2/s/docker-compose.yml -f /home/alex/testagent/_work/2/s/docker-compose.ci.build.yml -f /home/alex/testagent/.docker-compose.1505284937228.yml -p newsroomly/CoreSandbox build
Building coresandbox
Step 1/10 : FROM microsoft/dotnet:2.0-runtime
 ---> a2f5b3f42c0c
Step 2/10 : ARG source
 ---> Using cache
 ---> 7a707828214b
Step 3/10 : WORKDIR /app
 ---> Using cache
 ---> ff4262616387
Step 4/10 : COPY ${source:-obj/Docker/publish} .
Service 'coresandbox' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builder666656323/obj/Docker/publish: no such file or directory
Building coresandbox
Service 'coresandbox' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builder666656323/obj/Docker/publish: no such file or directory
/usr/local/bin/docker-compose failed with return code: 1
显然,问题在于,在compose尝试构建容器之前,不会运行dotnet构建任务

我还尝试了
dotnet生成我的.sln
,但由于此问题:不支持此操作,我收到
错误MSB4236:找不到指定的SDK“Microsoft.Docker.SDK”。

似乎
docker-compose.ci.build.yml
意味着您执行
docker-compose-f docker-compose.ci.build.yml-up
然后执行
docker-compose-f docker-compose.yml-build

然而,当我这样做时,我得到了关于缺少SDK的相同错误

/src/docker-compose.dcproj:错误MSB4236:找不到指定的SDK“Microsoft.docker.SDK”。

那么回到我的问题上来-我如何在VST上构建我的dcproj呢

我在使用.Net framework应用程序时遇到了完全相同的问题。我使用了另一个解决方案,在VS解决方案构建步骤中,我必须使用
Release
配置进行构建,否则发布文件夹将不会显示

你可以做的一件事是在你的dockerfile中更改这一行,我想这对我有帮助。 命令:

/bin/bash -c "dotnet restore ./CoreSandbox.sln && dotnet publish ./CoreSandbox.sln -c Release -o ./obj/Docker/publish"
到 命令:

/bin/bash -c "dotnet restore ./CoreSandbox.sln && dotnet publish ./CoreSandbox.sln -c Release -o ./obj/Docker"

我启动了我的私人建造代理,而且它比在VSTS中的hosted agent上下载docker映像节省了我很多时间。

/src/docker-compose.dcproj的修复:错误MSB4236:找不到指定的SDK“Microsoft.docker.SDK”。
是使用
Microsoft/aspnetcore构建:1.0-2.0
映像,而不是
microsoft/aspnetcore版本:2.0


2.0映像缺少Microsoft.Docker.Sdk。这将在2.1中从预览2开始修复。

完全不使用
docker compose.ci.build.yml如何,这有帮助吗?您使用的是托管代理还是私有代理?您是在Mac还是Linux构建代理上运行构建?Linux,私有。我找到了一个解决方法,稍后将发布到这里。这个问题有什么解决方法?您需要先指定docker-compose.ci.build.yml文件(docker-compose文件),然后在附加的docker-compose文件中指定docker-compose.yml,然后重试并检查结果。@starain MSFT em我确实指定了它,但一直失败。此外,ci yaml意味着我们希望在另一个容器中构建(谁知道为什么)。因此,简单地说,解决方法是使用./obj/Docker as-o路径自己构建,然后在compose中创建映像可以找到文件,并且一切正常。有一种解决方法,将一些文件部署到CI中,这实际上是有效的。然而,我已经不再使用dcproj了,它增加了0值和大量开销