< BACK TO BLOG

Reduce docker image size

πŸ—“οΈ2022-04-14

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 μ›Œν¬ν”Œλ‘œμš°μ—μ„œ 사섀 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬μ— μ—…λ‘œλ“œν•˜λŠ” λ™μž‘λ„ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.

docker image

GitHub Repository


Profile picture

Pon Cheol Ku (ꡬ본철)

Software developer

Other sites

If does not find interesting topic, you might visit other site on below link.

Β© 2024, Built with Gatsby