Trong bài viết này, mình sẽ hướng dẫn các bạn tạo file Dockerfile từ nhiều project trong ASP.NET Core.
Nếu bạn chưa biết cách build 1 project đơn giản ASP.NET Core thế nào, mời bạn xem bài viết: https://nhatkyhoctap.blogspot.com/2022/06/docker-tao-docker-file-part-4.html
Giả sử bạn có project có cấu trúc như sau:
📁 containerize-a-net-app
└──DockerizeMultiProject.sln
└──📂 DockerizeMultiProject
├──DockerizeMultiProject.csproj
├──*.*
└──📂 DockerizeMultiProject.Domain
├──DockerizeMultiProject.Domain.csproj
├──*.*
└──📂 DockerizeMultiProject.Infrastructure
├──DockerizeMultiProject.Infrastructure.csproj
├──*.*
- Bạn có thư mục chứa toàn bộ các project
- Folder chứa file *.sln
Tạo Dockerfile
Đầu tiên, cấu trúc để tạo Dockerfile trong project ASP.NET Core 6 như sau:
# syntax=docker/dockerfile:1
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app
#Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
#Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
#Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "dll-name.dll"]
Chúng ta sẽ có 2 dòng sử dụng SDK: sdk:6.0 và aspnet:6.0
Ngoài ra còn có các lệnh COPY, RUN, WORKDIR, và ENTRYPOINT.
Để build multi-project, bạn cần thực hiện thao tác:
- Giữ nguyên structure folder dự án, và copy file *.csproj vào đúng thư mục
- Thực hiện việc restore package
- Copy toàn bộ file vào vào folder dự án
- Publish website
- Run website
Để dễ hình dung, mình sẽ minh họa folder sau step 1 như sau
📁 app
└──DockerizeMultiProject.sln
└──📂 DockerizeMultiProject
├──DockerizeMultiProject.csproj
└──📂 DockerizeMultiProject.Domain
├──DockerizeMultiProject.Domain.csproj
└──📂 DockerizeMultiProject.Infrastructure
├──DockerizeMultiProject.Infrastructure.csproj
Các bước tiếp theo, sẽ copy các file khác như *.cs, *.css, *.js... Các bạn tự thử minh họa nha.
Dựa vào hướng dẫn trên,chúng ta tạo file Dockerfile trong thư mục chứa file DockerizeMultiProject.sln như sau:
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app
#
# copy csproj and restore as distinct layers
COPY *.sln .
COPY DockerizeMultiProject/*.csproj ./DockerizeMultiProject/
COPY DockerizeMultiProject.Domain/*.csproj ./DockerizeMultiProject.Domain/
COPY DockerizeMultiProject.Infrastructure/*.csproj ./DockerizeMultiProject.Infrastructure/
#
RUN dotnet restore
#
# copy everything else and build app
COPY DockerizeMultiProject/. ./DockerizeMultiProject/
COPY DockerizeMultiProject.Domain/. ./DockerizeMultiProject.Domain/
COPY DockerizeMultiProject.Infrastructure/. ./DockerizeMultiProject.Infrastructure/
#
WORKDIR /app/DockerizeMultiProject
RUN dotnet publish -c Release -o out
#
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
#
COPY --from=build-env /app/DockerizeMultiProject/out .
ENTRYPOINT ["dotnet", "DockerizeMultiProject.dll"]
Cuối cùng, bạn cần thực hiện 2 lệnh sau đây để build image và run container.
docker build -t dockerizemultiproject .
docker run -d -p 8080:80 --name dockermultidemo dockerizemultiproject
Các bạn có thể tải source code về tại: https://github.com/anbinhtrong/Dockerize-Web-App-With-Multiple-Layers/releases/tag/v.1.0.0
Hi vọng với bài viết nhỏ này, các bạn sẽ build được project thành công.
Giải thích: https://blogit.create.pt/telmorodrigues/2022/03/08/smaller-net-6-docker-images/
Trả lờiXóahttps://pythonspeed.com/articles/docker-history/
Trả lờiXóaThử thách build .NET trên alpine: https://www.c-sharpcorner.com/article/running-asp-net-core-in-linux-systemalpine-linux-distribution-using-docker/
Trả lờiXóa