2017-02-20 65 views
3

我用this tutorial來創建我的第一個docker webapi項目。dotnet aspnetcore docker build失敗,出現145錯誤代碼

我使用的是Windows 7(docker toolbox)。

這是我已經跑了:

dotnet new webapi 

這是Dockerfile:

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

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

EXPOSE 5000/tcp 
ENV ASPNETCORE_URLS http://*:5000 

ENTRYPOINT ["dotnet", "run"] 

這是我創建的圖像:

docker build -t mydemos:aspnetcorehelloworld . 

這就是我如何已創建並運行集裝箱:

docker run -d -p 8080:5000 -t mydemos:aspnetcorehelloworld 

我的服務成功作爲碼頭容器運行。

然後,我試圖改變Dockerfile到aspnetcore基本映像工作:

FROM microsoft/dotnet:latest改爲FROM microsoft/aspnetcore:1.0.1

新Dockerfile看起來像:

FROM microsoft/aspnetcore:1.0.1 
COPY . /app 
WORKDIR /app 

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

EXPOSE 5000/tcp 
ENV ASPNETCORE_URLS http://*:5000 

ENTRYPOINT ["dotnet", "run"] 

現在的我,我試圖建立新的圖像使用

docker build -t mydemos:aspnetcorehelloworld1 . 

我得到一個錯誤。
這是生成日誌:

Sending build context to Docker daemon 636.9 kB 
Step 1/8 : FROM microsoft/aspnetcore:1.0.1 
---> 2c7bbc508bb2 
Step 2/8 : COPY . /app 
---> Using cache 
---> 1d5b9bd908b3 
Step 3/8 : WORKDIR /app 
---> Using cache 
---> c1d5d091d111 
Step 4/8 : RUN dotnet restore 
---> Running in 8399e21caeb2 
Did you mean to run dotnet SDK commands? Please install dotnet SDK from: 
    http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409 
The command 'dotnet restore' returned a non-zero code: 145 

我走進網址,重新安裝的東西,我還得到一個錯誤。
我試圖在同一個命令行會話中使用dotnet cli命令,並且我成功(dotnet restore works)。

我試着搜索這個錯誤,但找不到任何解決方案。

我在這裏錯過了什麼?我在多次場合和測試中得到這個145錯誤。

回答

4

您使用的圖像僅包含.NET Core運行時,而不包含SDK。從下面的資料庫嘗試基本映像:

https://hub.docker.com/r/microsoft/aspnetcore-build/


你Dockerfile中有下面幾行:

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

這意味着,dotnet restoredotnet build命令在圖像內運行你正在使用。由於您正在使用的圖像沒有安裝SDK,因此無法找到這些命令,並且看到的失敗。上面鏈接的存儲庫中的映像中安裝了SDK,因此可以找到並執行dotnet restoredotnet build命令。

使用安裝了SDK的基本映像的替代方法是在開發機器上執行構建/發佈過程,然後將發佈的輸出複製到映像中。然後你Dockerfile只需要看看沿着線的東西:

FROM microsoft/aspnetcore:1.0.1 
WORKDIR /app 
COPY ./app . 
ENTRYPOINT ["dotnet", "TheNameOfYourProject.dll"] 

注意,現在的圖像內運行dotnet命令就是運行你的(預建)DLL的一個。這隻需要運行時,而不是SDK。

+0

感謝您的回答,但讓我明白一些事情。我正在嘗試基於另一個包含我需要的運行時的Docker鏡像來構建Docker鏡像。我知道構建過程需要SDK,但爲什麼我需要包含SDK的基礎映像? –

+0

@AmirPopovich我在答案中增加了一些細節,讓我知道你是否還有其他問題。 – Polynomial

+0

很好的解釋!非常感謝你。最後一個問題:是否有隻包含運行時和SDK的較小圖像?有沒有什麼辦法可以在我的docker文件中添加2 FROM命令? –

相關問題