2017-11-13 13 views
1

ためDockerfileドッカー用のVisual Studioツールでのコマンドは以下のようにCOPY . .コマンドを含むASP.NETプロジェクトのDockerfileを作成します。COPY。 。 ASP.NET

WORKDIR /src 
COPY *.sln ./ 
... 
COPY . . 

私が何を読んでから、<src>パラメータがに相対的ですコンテキストはWORKDIR /srcコマンドの影響を受けません。しかし、<dest>WORKDIRに関連しているので、/srcを指します。

このコマンドは、パッケージ化のために残りのファイル(docker-compose.yml、.dockerignoreなど)をルートから取り出すだけですか?もしそうなら、なぜこれはRUN dotnet build...コマンドの前に行われますか?以下

全Dockerfile:

FROM microsoft/aspnetcore:2.0 AS base 
WORKDIR /app 
EXPOSE 80 

FROM microsoft/aspnetcore-build:2.0 AS build 
WORKDIR /src 
COPY *.sln ./ 
COPY MyProject/MyProject.csproj MyProject/ 
RUN dotnet restore 
COPY . . # The line mentioned above 
WORKDIR /src/MyProject 
RUN dotnet build -c Release -o /app 

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

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

答えて

1

COPY . .コピーを再帰的に構築するためのコンテナにプロジェクト全体、。

最初のコピーrestoreと完全コピーの分離の理由は、ビルドを高速化するためのキャッシングトリックであるため、コードの変更が行われるたびにプロジェクトの依存関係をインストールする必要はありません。

Docker images are built in layers。 Dockerは、新しいレイヤーを構成する内容と指示を以前のビルドと比較します。既存のレイヤーのSHA256チェックサムと一致する場合、そのレイヤーのビルドステップはスキップできます。

コードは依存関係よりもはるかに変更され、依存関係は通常遅い(ish)ネットワークから取得されます。依存関係が完了した後にコードをコピーすると、他のすべての変更に対してキャッシュされた依存関係のレイヤーが破られることはありません。

のNode.js相当アプリの内容の前にpackage.jsonを行います:スコットHanselman氏から上記の

WORKDIR /app 
COPY package.json /app/ 
RUN npm install 
COPY . /app/ 
CMD ["node", "app/index.js"] 
0

いくつかの複数のポインタ:https://www.hanselman.com/blog/OptimizingASPNETCoreDockerImageSizes.aspx

PROヒント:ドッカーは、中間を作りについてスマートですイメージを作成して作業を最小限に抑えることができますが、私たち(著者)が正しいことをして助けてくれると便利です。

たとえば、.csprojをコピーした場所を確認してから、「ドットネットリストア」を実行しますか?しばしば、人々は "COPY。"復元を実行します。これでDockerは何が変更されたのかを検出することができず、すべてのビルドでリストアを支払うことになります。

この2つのステップを実行することで、プロジェクトをコピーし、復元し、コードをコピーします。これは、Dockerによって「ドットネットリストア」中間ステップがキャッシュされ、物事がより速く進むことを意味します。