2016-08-05 3 views
9

.NET Core 앱 도커 이미지를 작성하려고합니다. 하지만 어떻게 프로젝트의 NuGet 종속성을 이미지에 적용해야하는지 알 수 없습니다. 단순 이유로.NET 핵심 응용 프로그램 도커 이미지에 종속성을 포함시키는 방법은 무엇입니까?

나는 .NET 코어 콘솔 응용 프로그램을 작성했습니다 :

using System; 
using Newtonsoft.Json; 

namespace ConsoleCoreTestApp 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      Console.WriteLine($"Hello World: {JsonConvert.False}"); 
     } 
    } 
} 

을 그냥 Newtonsoft.Json 하나 명 NuGet 의존성을 가지고있다. Visual Studio에서 응용 프로그램을 실행하면 모든 것이 잘 동작합니다.

나는이 프로젝트에서 도커 이미지를 생성하고 거기에서 응용 프로그램을 실행하려고 할 때 그러나, 종속성 찾을 수 없습니다 :

# dotnet ConsoleCoreTestApp.dll 
Error: assembly specified in the dependencies manifest was not found -- package: 'Newtonsoft.Json', version: '9.0.1', path: 'lib/netstandard1.0/Newtonsoft.Json.dll' 

Newtonsoft.Json.dll는 복사되지 않기 때문에 예상 할 수입니다 Visual Studio에서 출력 폴더로.

여기 내가 사용하고있어 Dockerfile입니다 :이 문제를 다루는 권장되는 방법은

FROM microsoft/dotnet:1.0.0-core 
COPY bin/Debug /app 

있습니까?

컨테이너 내부에서 dotnet restore을 실행하고 싶지 않습니다. 컨테이너가 실행될 때마다 모든 종속성을 다시 다운로드하지 않으려합니다.

나는 에 RUN dotnet restore 항목을 추가 할 수 있었지만 이제는 microsoft/dotnet:<version>-core을 기본 이미지로 사용할 수 없다고 생각합니다.

그리고 Visual Studio에서 출력 폴더에 모든 종속성을 복사 할 수있는 방법을 찾을 수 없습니다 (일반 .NET Framework 프로젝트와 동일).

+0

나는 .net 사용자가 아닙니다. 내 무지를 용서합니다. 왜 'RUN dotnet restore'를 추가하면 dotnet 기본 이미지를 사용할 수 없습니까? – Matt

+0

@Matt가 정확하면'microsoft/dotnet'베이스 이미지를 사용해서는 안됩니다. –

+0

@Matt 코어 이미지에 restore 명령이 포함되어 있지 않기 때문에. –

답변

13

좀 더 읽고 나면 마침내 알아 냈습니다.

대신 dotnet build

당신은 실행 :이 publish 폴더에 (종속 포함) 모든 파일을 배치합니다

dotnet publish 

. 이 폴더는 microsoft/dotnet:<version>-core 이미지와 함께 직접 사용될 수 있습니다.

2

나는 이것을 최근에 tutorial이라고 썼습니다. 내가 사용하는 Dockerfile 내용은 (약간 ASP.NET 코어 비트를 제거하기 위해 수정)했다 : 당신이 docker build을 실행하면

FROM microsoft/dotnet:latest 
COPY . /app 
WORKDIR /app 

RUN ["dotnet", "restore"] 
RUN ["dotnet", "build"] 

ENTRYPOINT ["dotnet", "run"] 

, 그것은 이미지를 구축 할 수있는 "레시피"로 Dockerfile을 사용합니다. dotnet restoredotnet build을 먼저 실행하고 을 입력 한 다음을 모두 이미지에 넣습니다. 결과 이미지에는 앱이 Docker 호스트에서 실행해야하는 모든 것이 있습니다.

+1

불행하게도 이것은'dotnet : xxx-core' 이미지로는 작동하지 않습니다.하지만, dotnet과 dotnet : xxx-core의 차이가 기본 이미지인지 여부는 확실하지 않습니다. –

+0

@SebastianKrysmanski 그냥 궁금한데, 왜 'dotnet : latest' 대신에'dotnet : xxx-core'를 사용하고 싶습니까? –

+1

특별한 이유가 없습니다. 그것은 나에게 가장 논리적 인/최소한의 해결책으로 보였다. 또한 컨테이너에 소스 코드를 넣지 않으려 고합니다. –

관련 문제