基于VSTS的Docker编写
我有一个.net核心应用程序,我想在docker上运行。 我使用VS 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">
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值和大量开销