官术网_书友最值得收藏!

Compiling with multi-stage builds

In a multi-stage build you have multiple FROM instructions in your Dockerfile, where each FROM instruction starts a new stage in the build. Docker executes all the instructions when you build the image, and later stages can access the output from earlier stages, but only the final stage is used for the completed image.

I can write a multi-stage Dockerfile for the .NET Core console app by combining the previous two Dockerfiles into one:

# build stage
FROM microsoft/dotnet:2.2-sdk-nanoserver-1809 AS builder

WORKDIR /src
COPY src/ .

USER ContainerAdministrator
RUN dotnet restore && dotnet publish

# final image stage
FROM microsoft/dotnet:2.2-runtime-nanoserver-1809

WORKDIR /dotnetapp
COPY --from=builder /src/bin/Debug/netcoreapp2.2/publish .

CMD ["dotnet", "HelloWorld.NetCore.dll"]

There are a couple of things that are new here. The first stage uses a large base image, with the .NET Core SDK installed. I've named this stage builder, using the AS option in the FROM instruction. The rest of the stage goes on to copy in the source code and publish the application. When the builder stage completes, the published application will be stored in an intermediate container.

The second stage uses the runtime .NET Core image, which doesn't have the SDK installed. In this stage I copy the published output from the previous stage, specifying --from=builder in the COPY instruction. Anyone can compile this application from the source using Docker, without needing .NET Core installed on their machine.

Multi-stage Dockerfiles for Windows apps are completely portable. To compile the app and build the image, the only prerequisite is to have a Windows machine with Docker installed, and a copy of the code. The builder stage contains the SDK and all the compiler tools, but the final image just has the minimum needed to run the application.

This approach isn't just for .NET Core. You can write a multi-stage Dockerfile for a .NET Framework app, where the first stage uses an image with MSBuild installed, which you use to compile your application. There are plenty of examples of this later in the book.

Whichever approach you take, there are just a few more Dockerfile instructions that you need to understand in order to build more complex application images, for software which integrates with other systems.

主站蜘蛛池模板: 丁青县| 谢通门县| 即墨市| 墨江| 萝北县| 昌图县| 延吉市| 隆林| 双江| 金溪县| 营口市| 崇阳县| 怀柔区| 开江县| 化德县| 珲春市| 临清市| 弥渡县| 汉中市| 和平区| 玉屏| 石渠县| 水富县| 镇巴县| 富宁县| 仙居县| 扎赉特旗| 全椒县| 湟源县| 湖南省| 田阳县| 新源县| 阜阳市| 望城县| 兴安县| 黄浦区| 莱芜市| 城口县| 台湾省| 扎兰屯市| 济源市|