GitHub Actions μ μν¬νλ‘μ°λ₯Ό μ΄μ©ν΄μ ASP.NET Core μμ©νλ‘κ·Έλ¨μ λ컀 μ΄λ―Έμ§λ‘ λΉλν΄μ μ¬μ€ λ컀 λ μ§μ€νΈλ¦¬μ μ λ‘λνκ³ μμ΅λλ€.
GitHub: bing-wallpaper docker image workflow μμ λμμ νμΈνμ€ μ μμ΅λλ€.
μΈμ κ° λΆν° μν¬νλ‘μ°κ° μ€ν¨νκ³ μμμ΅λλ€.
Merge pull request #114 from bbonkr/dev docker image #17
μ€λ₯ λ©μμ§λ μλμ κ°μ΅λλ€.
buildx failed with: error: failed to solve: failed to copy: unexpected status: 413 Request Entity Too Large
μ€λ₯ λ©μμ§λ₯Ό μ°Έμ‘°ν΄μ μμΈ ν΄κ²°μ μν΄ κ²μμ ν΄λ³΄λ©΄ μ¬μ€ λ컀 λ μ§μ€νΈλ¦¬ νκ²½μμ νμ© μ λ‘λ ν¬κΈ°λ₯Ό μ΄κ³Όν κ²½μ° λ°μνλ λ©μμ§λ‘ νλ¨λ©λλ€.
νμ§λ§, λ컀 λ μ§μ€νΈλ¦¬ μ€ννκ²½μλ νμ© μ λ‘λ ν¬κΈ°λ₯Ό μ ννκ³ μμ§ μμ΅λλ€.
nginx νμ© μ λ‘λ ν¬κΈ°κ΄λ ¨ ꡬμ±μ μλμ κ°μ΅λλ€.
http {
client_max_body_size 0;
}
μλ² μΈ‘μμ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€κ³ μκ°λμ΄ λ컀 μ΄λ―Έμ§ ν¬κΈ°λ₯Ό μ€μ΄κΈ°λ‘ κ²°μ νμ΅λλ€.
νμΈ
μμ©νλ‘κ·Έλ¨ μΆλ ₯ ν¬κΈ° νμΈ
dotnet cli κ²μ λͺ λ ΉμΌλ‘ μΆλ ₯ν΄μ ν¬κΈ°λ₯Ό νμΈν΄λ³΄λ μλμ κ°μ΄ ν¬κΈ°κ° νμΈλ©λλ€.
$ dotnet publish ./src/Bing.Wallpaper/Bing.Wallpaper.csproj -c Release -o ./test-out
$ du -sh ./test-out
298M ./test-out
μκ°λ³΄λ€ ν¬κΈ°κ° ν½λλ€.
μ€νλλ νκ²½μ΄ linux x64 νκ²½μΌλ‘ μ νλλ, μΆλ ₯ ν¬κΈ°λ₯Ό μ€μ΄κΈ° μν΄ νλ«νΌμ μ§μ ν΄μ νμΈν©λλ€.
$ dotnet publish ./src/Bing.Wallpaper/Bing.Wallpaper.csproj -c Release -o ./test-out --runtime linux-x64
$ du -sh ./test-out
161M ./test-out
dotnet cli μΆλ ₯ λͺ λ Ή μ€νμ€ μ¬λ¬ κ²½κ³ κ° μΆλ ₯λ©λλ€.
κ·Έ μ€, βruntime μ μ§μ νλ κ²½μ° λ¨μΌ νμΌλ‘ μΆλ ₯ν μ§ μ¬λΆλ₯Ό μ§μ νλΌλ λ©μμ§κ° μμ΄, κ²μ μ΅μ μ μΆκ°ν©λλ€.
$ dotnet publish ./src/Bing.Wallpaper/Bing.Wallpaper.csproj -c Release -o ./test-out --runtime linux-x64 --no-self-contained
$ du -sh ./test-out
71M ./test-out
298 MB μμ 71MB λ‘ μΆλ ₯ νμΌμ ν¬κΈ°κ° μ€μ΄λ€μμ΅λλ€.
λ컀 μ΄λ―Έμ§ λΉλ νμΈ
Apple M1 μ μ¬μ©νλ λ‘컬 μ₯μΉμ λ컀 λ°μ€νΈν±μ μ€μΉν΄μ μμμ λ²μ μ νκ·Έλ‘ μ§μ ν΄μ λΉλν΄μ νμΈμ μ§ννμ΅λλ€.
νμ¬ λ컀 λΉλ μ μ νμΌμμ μ¬λ¬ λ¨κ³μ λΉλλ₯Ό μ¬μ©νκ³ μμ΅λλ€.
base λ³μΉμ μ€μ ν μ΄λ―Έμ§λ₯Ό λ³κ²½ν΄μ ν¬κΈ°λ₯Ό μ€μΌ μ μμ κ²μΌλ‘ μκ°λ©λλ€.
κΈ°λ‘ν΄λμ§ μμμ μ ννμ§ μμ§λ§, mcr.microsoft.com/dotnet/aspnet:6.0
μ΄λ―Έμ§λ₯Ό κΈ°λ°μΌλ‘ μμ±λ λ컀 μ΄λ―Έμ§λ μ½ 400 MB λ₯Ό μ΄κ³Όνλ ν¬κΈ°μμ΅λλ€.
μ 곡λλ λ€λ₯Έ μ΄λ―Έμ§λ‘ μλν©λλ€.
DockerHub: ASP.NET Core Runtime νμ΄μ§μμ μ 곡λλ μ΄λ―Έμ§λ₯Ό λͺ¨λ νμΈνμ€ μ μμ΅λλ€.
ν¬κΈ°κ° μμ κ²μΌλ‘ μμλλ alpine μ΄λ―Έμ§λ₯Ό μ¬μ©ν΄μ λΉλν©λλ€.
FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine AS base
$ docker build . -t bbonkr/bing-wallpaper:1.0.3 --platform linux/amd64
λ컀 μ΄λ―Έμ§μ ν¬κΈ°λ 174.34 MB μ λλ€.
λ§€μ° λ§μ΄ μ€μ΄λ€μμ΅λλ€.
κ·Έλ°λ°, 컨ν μ΄λ μ€νμ μ€λ₯κ° λ°μν©λλ€.
μ€λ₯ λ©μμ§λ μλμ κ°μ΅λλ€.
Unhandled exception. System.Globalization.CultureNotFoundException: Only the invariant culture is supported in globalization-invariant mode. See https://aka.ms/GlobalizationInvariantMode for more information. (Parameter 'name')
en-us is an invalid culture identifier.
κ΄λ ¨ λ΄μ©μ μ°Ύμ보면, apline μμλ μ§μν κΈ°λ₯μ μ¬μ©ν μ μμ΅λλ€.
The fix: install the ICU cultures and disable Globalization Invariant Mode
.NET μ§μν κΈ°λ₯μ μ¬μ©ν νμκ° μμΌλ©΄, λ컀 λΉλ μ μμ μλ μ 보λ₯Ό μΆκ°ν΄μ λΉλνλ©΄ λ©λλ€.
base λ³μΉμ΄ μ§μ λ μ΄λ―Έμ§μμ μλ λͺ λ Ήμ΄ μ€νλμ΄μΌ ν©λλ€.
RUN apk add --no-cache icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
λ©μΈ νλ‘μ νΈ νμΌμ μ΄κ³ μλ μ 보λ₯Ό μΆκ°ν©λλ€.
<PropertyGroup>
<InvariantGlobalization>false</InvariantGlobalization>
</PropertyGroup>
μμ© νλ‘κ·Έλ¨μμ νμν λ€λ₯Έ μμ‘΄ λΌμ΄λΈλ¬λ¦¬κ° μλ€λ©΄, λͺ¨λ μ°Ύμμ μ€μΉν΄μΌ ν©λλ€.
λ§€μ° λΆνΈν©λλ€.
ν¬κΈ°λ₯Ό μ‘°κΈ λ 컀μ§λλΌλ, νΈλ¦¬νκ² μ¬μ©νκΈ° μν΄ Debian κΈ°λ° μ΄λ―Έμ§λ‘ λ³κ²½ν©λλ€.
dockerfile μ base λ¨κ³ μ΄λ―Έμ§λ₯Ό λ³κ²½ν©λλ€.
FROM mcr.microsoft.com/dotnet/aspnet:6.0-bullseye-slim AS base
$ docker build . -t bbonkr/bing-wallpaper:1.0.6 --platform linux/amd64
λ컀 μ΄λ―Έμ§μ ν¬κΈ°λ 282.32 MB μ λλ€.
컨ν μ΄λλ₯Ό μ€ννλ©΄ μ μμ μΌλ‘ μ€νλ©λλ€.
νΉμλ λ€λ₯Έ μ΄μκ° μμΌλ©΄ λμνκΈ° μν΄ μμ£Ό μ¬μ©νλ Ubuntu κΈ°λ° μ΄λ―Έμ§λ‘ λ³κ²½ν©λλ€.
FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal AS base
λ컀 μ΄λ―Έμ§μ ν¬κΈ°λ 283.68 MB μ λλ€.
컨ν μ΄λλ₯Ό μ€ννλ©΄ μ μμ μΌλ‘ μ€νλ©λλ€.
μλ£
μμ±λλ λ컀 μ΄λ―Έμ§ ν¬κΈ°λ₯Ό μ‘°μ ν ν GitHub Actions μν¬νλ‘μ°μμ μ¬μ€ λ컀 λ μ§μ€νΈλ¦¬μ μ λ‘λνλ λμλ μ μμ μΌλ‘ μ€νλ©λλ€.