88 lines
2.3 KiB
Markdown
88 lines
2.3 KiB
Markdown
|
# Multistage & Layers
|
||
|
|
||
|
Previously, in [Topic 2, Working with Code](working_with_code.md), we have dockerfile to create isolated DEV environment, but we still have to manually `dotnet new/build/run`
|
||
|
|
||
|
Target: Use multistage dockerfile to automatically setup DEV & PROD environment, where we only need to modify source code.
|
||
|
|
||
|
## What is Docker Image Layering?
|
||
|
|
||
|
dockerfile lay layers on top of another. So often changed layers should be in bottom to save image building time
|
||
|
|
||
|
### General DEV + PROD multistage dockerfile structure
|
||
|
|
||
|
```dockerfile
|
||
|
######## Dev stage #########
|
||
|
# Start from a base image (Layer 1)
|
||
|
FROM base-SDK-image-here
|
||
|
|
||
|
# install dependencies (Layer 2)
|
||
|
RUN pip install \npm install \go get
|
||
|
|
||
|
# Copy source code into image (Layer 3)
|
||
|
COPY source
|
||
|
|
||
|
# Run assembly to build app based on source code (Layer 4)
|
||
|
RUN build
|
||
|
```
|
||
|
|
||
|
Above is the dockerfile for a development environment. To product ready, we can use multistage. By giving above codes an alias, we can build multi-stage images
|
||
|
|
||
|
continue dockerfile
|
||
|
|
||
|
```dockerfile
|
||
|
####### Runtime stage #########
|
||
|
# Using a runtime image instead of full SDK (Layer 5)
|
||
|
FROM another-image
|
||
|
|
||
|
# Copy compiled app into runtime image to save space (Layer 6)
|
||
|
COPY output-from-stage-1
|
||
|
|
||
|
# Start app or entrypoint
|
||
|
RUN application
|
||
|
```
|
||
|
|
||
|
Benefit of this multistage, we can use debug tools in dev stage, but also keep product small in stage 2
|
||
|
|
||
|
## Modify dockerfile and docker-compose for multistage building
|
||
|
|
||
|
### Add build target in docker-compose
|
||
|
|
||
|
Adding build target in `build`, so docker-compose can be directly used to create DEV/PROD image.
|
||
|
|
||
|
```docker-compose
|
||
|
build:
|
||
|
context: ./c#
|
||
|
target: dev
|
||
|
```
|
||
|
|
||
|
### Modify dockerfile
|
||
|
|
||
|
```dockerfile
|
||
|
############# DEV IMAGE #################
|
||
|
# Define a dev stage using `as`
|
||
|
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch as dev
|
||
|
|
||
|
# Defining a working directory
|
||
|
RUN mkdir /app/
|
||
|
WORKDIR /app/
|
||
|
|
||
|
# ????
|
||
|
COPY ./src/work.csproj /app/work.csproj
|
||
|
RUN dotnet restore
|
||
|
|
||
|
# Copy the remaining source file
|
||
|
COPY ./src/ /app/
|
||
|
RUN mkdir /out/
|
||
|
RUN dotnet publish --no-restore --output /out/ --configuration Release
|
||
|
|
||
|
############## PRODUCT IMAGE #############
|
||
|
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch-slim as prod
|
||
|
|
||
|
RUN mkdir /app/
|
||
|
WORKDIR /app/
|
||
|
|
||
|
# Copy binary into folder
|
||
|
COPY --from=dev /out/ /app/
|
||
|
RUN chmod +x /app/
|
||
|
CMD dotnet work.dll
|
||
|
```
|