[Docker] docker build ์†๋„ ์ฐจ์ด

.NET ์œผ๋กœ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

A ํ”„๋กœ์ ํŠธ๋ฅผ Image๋กœ ๋งŒ๋“ค ๋•Œ ํ˜„์žฌ๋Š” B,C,D,E,F ํ”„๋กœ์ ํŠธ๊ฐ€ ์ฐธ์กฐ๋กœ ๋‹ฌ๋ ค์žˆ๊ณ  ๊ทธ ๋ฐ–์— Nuget ํŒจํ‚ค์ง€๋„ ์•ฝ๊ฐ„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ƒํƒœ์—์„œ Docker Build๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์‹œ๊ฐ„์ด 5~10๋ถ„ ๊ฐ€๋Ÿ‰ ์†Œ์š”๋˜๋ฉฐ, ๊ฐ„ํ˜น grpc ํ†ต์‹  ์žฅ์• ๋ผ๋Š” ๋‚ด์šฉ์ด ๋ฐœ์ƒํ•˜๋ฉด์„œ ์ทจ์†Œ๋œ๋‹ค๋Š” ๋กœ๊ทธ๊ฐ€ ๋‚จ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๊ธธ์–ด์„œ ๊ทธ๋Ÿฐ๊ฑด์ง€ ๊ฐ์ด ์ž˜ ์•ˆ์žกํžˆ๋„ค์š”.

ํ˜น์‹œ ์ด B,C,D,E,F ๋ฅผ Nuget ํŒจํ‚ค์ง€๋กœ ๋งŒ๋“ค์–ด์„œ A ํ”„๋กœ์ ํŠธ์— ์ฐธ์กฐ์‹œํ‚ค๋ฉด, ๋นŒ๋“œ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๋Š”์ง€ ์—ฌ์ญ™๋‹ˆ๋‹ค.

์•„๋ฌด๋ž˜๋„ .NET์—์„œ Docker ๋นŒ๋“œํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋‹ค๋ณด๋‹ˆ ์ด๋Ÿฐ ์งˆ๋ฌธ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” Dockerfile ์ž…๋‹ˆ๋‹ค. PAT ๋ถ€๋ถ„์€ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.

FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["AwesomeSwagWeb/AwesomeAutoImageSlice/Nuget.config", "."]
COPY ["Translate/Translate/Translate/nuget.config", "./Translate/"]
COPY ["AwesomeSwagWeb/AwesomeAutoImageSlice/AwesomeAutoImageSlice.csproj", "./AwesomeAutoImageSlice/"]
COPY ["AwesomeSwagWeb/AwesomeSwagSDK/AwesomeSwagSDK.csproj", "./AwesomeSwagSDK/"]
COPY ["Crawling/ElevenStreet/ElevenStreet.csproj", "./Crawling/ElevenStreet/"]
COPY ["Crawling/NaverSmartStore/NaverSmartStore.csproj", "./Crawling/NaverSmartStore/"]
COPY ["ShopeeV2/ShopeeSDKV2/ShopeeSDKV2.csproj", "./ShopeeV2/ShopeeSDKV2/"]
COPY ["Translate/Translate/Translate/Translate.csproj", "./Translate/"]
COPY ["Crawling/GMarket/GMarket.csproj", "./Crawling/GMarket/"]
COPY ["AwesomeSwagWeb/AwesomeFunctionInfraStructure/AwesomeFunctionInfraStructure.csproj", "./AwesomeFunctionInfraStructure/"]

ARG PAT=localhost
RUN sed -i "s|</configuration>|<packageSourceCredentials><EcremmoceSDK><add key=\"Username\" value=\"PAT\" /><add key=\"ClearTextPassword\" value=\"${PAT}\" /></EcremmoceSDK></packageSourceCredentials></configuration>|" nuget.config
RUN wget -qO- https://aka.ms/install-artifacts-credprovider.sh | bash
ENV DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER=0
ENV NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED true
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS {\"endpointCredentials\": [{\"endpoint\":\"https://pkgs.dev.azure.com/ecremmoce/_packaging/EcremmoceSDK/nuget/v3/index.json\", \"username\":\"Email\", \"password\":\"PAT\"}]}

RUN dotnet restore "AwesomeAutoImageSlice/AwesomeAutoImageSlice.csproj"

COPY . .
WORKDIR "/src/AwesomeAutoImageSlice"
RUN dotnet build "AwesomeAutoImageSlice.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "AwesomeAutoImageSlice.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "AwesomeAutoImageSlice.dll"]

์•„๋ž˜๋Š” ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

PS docker build --tag awesomeautoimageslice:v1 -f ./AwesomeSwagWeb/AwesomeAutoImageSlice/Dockerfile .
[+] Building 2.4s (7/28)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 2.60kB 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for Microsoft Artifact Registry 0.1s
=> [internal] load metadata for Microsoft Artifact Registry 0.0s
=> [internal] load build context 2.1s
=> => transferring context: 1.35MB 2.1s
=> [build 1/18] FROM Microsoft Artifact Registry 2.1s
=> => resolve Microsoft Artifact Registry 0.0s
=> => sha256:9de0f41d10e468114e385ab1160a345f5fc22a08b9470d94a17e58fd9e60846e 13.63MB / 27.56MB 2.1s
=> => sha256:9a62ac752fdce16f8531a11e900d9851a6316fd978a23e2a589fc4534fd7d6c7 14.68MB / 106.09MB 2.1s
=> => sha256:d11f0b2c983ad35ae7b129745ce4bc33c29720f4e746658fb856a776271c013e 2.01kB / 2.01kB 0.0s
[+] Building 464.0s (10/28)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 2.60kB 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for Microsoft Artifact Registry 0.1s
=> [internal] load metadata for Microsoft Artifact Registry 0.0s
=> ERROR [internal] load build context 463.8s
=> => transferring context: 5.77GB 386.1s
=> [build 1/18] FROM Microsoft Artifact Registry 13.2s
=> => resolve Microsoft Artifact Registry 0.0s
=> => sha256:9de0f41d10e468114e385ab1160a345f5fc22a08b9470d94a17e58fd9e60846e 27.56MB / 27.56MB 3.5s
=> => sha256:9a62ac752fdce16f8531a11e900d9851a6316fd978a23e2a589fc4534fd7d6c7 106.09MB / 106.09MB 6.6s
=> => sha256:d11f0b2c983ad35ae7b129745ce4bc33c29720f4e746658fb856a776271c013e 2.01kB / 2.01kB 0.0s
=> => sha256:4541344c527ed4f6515a5408c21c56a032b1087ddda44314e0d5bc91d4fa6138 7.11kB / 7.11kB 0.0s
=> => sha256:d1c77e057844e46417d0d034b7a976e2f0a36b9f40e3abb2371a89d2b7f4eadc 8.65MB / 8.65MB 1.6s
=> => sha256:c4e077f49300f7f624ae7624โ– โ– 7a12599c32c146d25dea6b62d4405d067a2ec1 2.17kB / 2.17kB 0.0s
=> => sha256:3bcabca0b205c751ff0f7d8178bf36817aac273eacc8fa79164daa823d19b6c1 12.69MB / 12.69MB 3.3s
=> => extracting sha256:d1c77e057844e46417d0d034b7a976e2f0a36b9f40e3abb2371a89d2b7f4eadc 0.4s
=> => extracting sha256:9de0f41d10e468114e385ab1160a345f5fc22a08b9470d94a17e58fd9e60846e 2.0s
=> => extracting sha256:9a62ac752fdce16f8531a11e900d9851a6316fd978a23e2a589fc4534fd7d6c7 5.4s
=> => extracting sha256:3bcabca0b205c751ff0f7d8178bf36817aac273eacc8fa79164daa823d19b6c1 0.7s
=> [base 1/2] FROM Microsoft Artifact Registry 0.0s
=> CACHED [base 2/2] WORKDIR /app 0.0s
=> CACHED [final 1/2] WORKDIR /app 0.0s
=> [build 2/18] WORKDIR /src 0.5s
------CHED [final 1/2] WORKDIR /app 0.0s
[internal] load build context:
rpc error: code = Canceled desc = grpc: the client connection is closing


PS C:\Users\user\source\repos\christian289_Ecremmoce> docker build --tag awesomeautoimageslice:v1 -f ./AwesomeSwagWeb/AwesomeAutoImageSlice/Dockerfile .
[+] Building 579.3s (10/28)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 32B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for Microsoft Artifact Registry 0.0s
=> [internal] load metadata for Microsoft Artifact Registry 0.0s
=> CANCELED [internal] load build context 579.0s
=> => transferring context: 4.87GB 578.4s
=> [build 1/18] FROM Microsoft Artifact Registry 0.0s
=> [base 1/2] FROM Microsoft Artifact Registry 0.0s
=> CACHED [base 2/2] WORKDIR /app 0.0s
=> CACHED [final 1/2] WORKDIR /app 0.0s
=> CACHED [build 2/18] WORKDIR /src 0.0s
context canceled


PS C:\Users\user\source\repos\christian289_Ecremmoce> docker build --tag awesomeautoimageslice:v1 -f ./AwesomeSwagWeb/AwesomeAutoImageSlice/Dockerfile .
[+] Building 658.2s (9/28)
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 2.70kB 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B
=> [internal] load build definition from Dockerfile 0.1scrosoft.com/dotnet/sdk:5.0
=> => transferring dockerfile: 2.70kB 0.0scrosoft.com/dotnet/runtime:5.0
=> [internal] load .dockerignore 0.1sm/dotnet/sdk:5.0
=> => transferring context: 2B 0.0s
=> [internal] load metadata for Microsoft Artifact Registry 0.0s
=> [internal] load metadata for Microsoft Artifact Registry 0.0sotnet/runtime:5.0
=> [build 1/18] FROM Microsoft Artifact Registry 0.0s
[+] Building 755.2s (21/28)
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 2.70kB 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for Microsoft Artifact Registry 0.0s
=> [internal] load metadata for Microsoft Artifact Registry 0.0s
=> [build 1/18] FROM Microsoft Artifact Registry 0.0s
=> [internal] load build context 749.6s
=> => transferring context: 26.22GB 749.0s
=> [base 1/2] FROM Microsoft Artifact Registry 0.0s
=> CACHED [base 2/2] WORKDIR /app 0.0s
=> CACHED [final 1/2] WORKDIR /app 0.0s
=> CACHED [build 2/18] WORKDIR /src 0.0s
=> [build 3/18] COPY [AwesomeSwagWeb/AwesomeAutoImageSlice/Nuget.config, .] 3.5s
=> [build 4/18] COPY [Translate/Translate/Translate/nuget.config, ./Translate/] 0.2s
=> [build 5/18] COPY [AwesomeSwagWeb/AwesomeAutoImageSlice/AwesomeAutoImageSlice.csproj, ./AwesomeAutoImageSlice/] 0.1s
=> [build 6/18] COPY [AwesomeSwagWeb/AwesomeSwagSDK/AwesomeSwagSDK.csproj, ./AwesomeSwagSDK/] 0.1s
=> [build 7/18] COPY [Crawling/ElevenStreet/ElevenStreet.csproj, ./Crawling/ElevenStreet/] 0.1s
=> [build 8/18] COPY [Crawling/NaverSmartStore/NaverSmartStore.csproj, ./Crawling/NaverSmartStore/] 0.1s
=> [build 9/18] COPY [ShopeeV2/ShopeeSDKV2/ShopeeSDKV2.csproj, ./ShopeeV2/ShopeeSDKV2/] 0.1s
=> [build 10/18] COPY [Translate/Translate/Translate/Translate.csproj, ./Translate/] 0.1s
=> [build 11/18] COPY [Crawling/GMarket/GMarket.csproj, ./Crawling/GMarket/] 0.1s
=> [build 12/18] COPY [AwesomeSwagWeb/AwesomeFunctionInfraStructure/AwesomeFunctionInfraStructure.csproj, ./AwesomeFunctionInfraStructure/] 0.1s
=> ERROR [build 13/18] RUN sed -i โ€œs|||โ€ nuget.config 0.5s
[build 13/18] RUN sed -i โ€œs|||โ€ nuget.config:
#21 0.421 sed: canโ€™t read nuget.config: No such file or directory
executor failed running [/bin/sh -c sed -i โ€œs||<add key="Username" value="PAT" /><add key="ClearTextPassword" value="${PAT}" />|โ€ nuget.config]: exit code: 2
PS C:\Users\user\source\repos\christian289_Ecremmoce>

์œ„ ๋กœ๊ทธ๋Š” docker build๋ฅผ 3ํšŒ ์ˆ˜ํ–‰ํ•œ ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”

ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋Š” ๋นŒ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ์ฐธ์กฐ๋œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ๋นŒ๋“œํ•œ ๋’ค ๋ณธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋นŒ๋“œ๋˜๊ณ , nuget์„ ์ด์šฉํ•˜๋ฉด ์ด๋ฏธ ๋นŒ๋“œ๋œ dll์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฑฐ๋ผ ์ฐจ์ด๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”.

4๊ฐœ์˜ ์ข‹์•„์š”

๋„ค ๊ฒฐ๊ตญ ์‹ค์ œ๋กœ ํ•ด๋ดค๋Š”๋ฐ ์—„์ฒญ๋‚˜๊ฒŒ ๋นจ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ๋Š” ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ๋ฅผ ๊ฑท์–ด๋‚ด๊ณ  Nuget ํŒจํ‚ค์ง€๋งŒ ์ฐธ์กฐํ•ด์„œ Docker ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ˜‘์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”