Day2 Dockerfile
25565 ワード
1. Dockerfile
0)準備完了
先日初日、MSA、Dockerについて知りました.今日はその中でプロジェクトのDockerfileを学びました.
プロジェクトの例では、「eShop on Dapr」が使用されます.
Dapr GithubアドレスのeShowについて
1)Dockerfileコマンド
コマンドを理解する前に、Dockerfileに基づいてDockerイメージを作成することを知っていました.
まずその方法を簡単に見てみましょう.docker build -f /path/to/a/Dockerfile -t testImage:1.0
docker buildは、画像を簡単に生成できるコマンドです。
以下の内容はオプションです.
docker build -f /path/to/a/Dockerfile -t testImage:1.0
-FROM:基本画像(1つの画像層とみなされる)。
どのイメージから始めるかを決める命令.
-UN:必要なパッケージをインストールするための新しいイメージレイヤを作成します。
式には2つの方法があります.
RUN apt-get update -yq \
&& apt-get install curl gnupg -yq \
&& curl -sL https://deb.nodesource.com/setup_10.x | bash \
&& apt-get install nodejs -yq
RUN ["/bin/bash", "-c", "echo hello"]
-MDとENTRYPOINT:両方とも画像に基づいて生成されたコンテナでコマンドを実行します。
CMD ["dotnet", "WebSPA.dll"]
ENTRYPOINT ["dotnet", "WebSPA.dll"]
両者の違いは以下の通り. docker run --name <container-name> <image-name>
> This is a test
docker run --name <container-name> <image-name> echo "Hello"
> Hello
docker run --name <container-name> <image-name>
> Hello world
docker run --name <container-name> <image-name> ME
> Hello ME
-HELTHCHEACK:containerのプロセス状態。
コマンドのオプションは次のとおりです.
オプション説明デフォルト値--interval=Durationフィットネスチェック間隔30 s--timeout=Duration timeout 30 s--再試行=N timeout回数3
ステータス値は次のとおりです.
EXITコード説明0:success容器正常1:不健康な容器運転不良2:起動上のexitコードを使用しない
容器の状態は下記の通り確認できます.
docker container inspect [container name]
上記のオプションを適用する例.HEALTHCHECK --interval=10s --timeout=3s CMD curl -f http://127.0.0.1/ || exit 1
(上記の住所を10秒ごとにチェックするのに3秒以上かかるか、再試行に失敗した場合は不健康状態に変更してください)-COPYとADD:どちらもhost OSのファイルまたはディレクトリをコンテナ内の指定されたパスにコピーします。
両者の違いは以下の通り.
COPY <src>... <destination>
COPY ["<src>",... "<destination>"]
ADD <src>... <destination>
ADD ["<src>",... "<destination>"]
(COPYは、コンテナ内のローカルファイルのみをCOPYできます.Docker Clientにリストされているディレクトリにファイルを追加します.)
(代わりに、ADDは、リモートURLをサポートしたり、tarファイルのみにローカルを抽出したりするなど、直感的でない追加機能を提供する.)
-ENVとARG:両方とも変数を設定するコマンドです。
両者の違いは以下の通り.
-WORKDIR:コマンドを実行するディレクトリを指定します。
-LABEL:画像のバージョン、作成者、コメントなど、画像を入力するメタデータ
LABEL title="webserver"
LABEL version="2.0"
-XPOSE:containerが待機するネットワークポートを通知します。
(通常は共通ポート、Apache:80、MongoDB:27017を使用します)
ただし、このコマンド自体はportを実行せずにリスニング状態にアップグレードするため、実際にportを開くにはcontainer run-pを使用してコンテナを実行するときにオプションとして実行する必要があります.
dockerfileの作成とcontainerの実行者間で共通ポートを通知する構文
-VOLUMEの削除:containerでは内部のすべてのデータが失われるため、保持するデータはVOLUMEを使用してhost OSに格納され、コンテナ間でデータが共有されます。
FROM centos:7
VOLUME ["/var/log/", "/data/"]
/var/logのデータおよび/data/のデータはhost OSの/var/lib/docker/volumes/に格納されます.2) eShop on Dapr's Dockerfiles
DaprのDockerfileで上の2つを読んでみましょう
// src/Services/Basket/Basekt.API/Dockerfile
ARG NET_IMAGE=5.0-buster-slim // NET_IMAGE라는 dockerfile에서만 쓸 수 있는 변수 설정
FROM mcr.microsoft.com/dotnet/aspnet:${NET_IMAGE} AS base // 시작할 image를 정하고 이름을 base로 설정
WORKDIR /app // app에서 시작하고
EXPOSE 80 // 80 port로 진행
FROM mcr.microsoft.com/dotnet/sdk:${NET_IMAGE} AS build // image 를 build라고 명명
WORKDIR /src // 디렉토리 변경
// <src>를 <destination>에 COPY 함 (1번만 진행)
COPY ["src/ApiGateways/Aggregators/Web.Shopping.HttpAggregator/Web.Shopping.HttpAggregator.csproj", "src/ApiGateways/Aggregators/Web.Shopping.HttpAggregator/"]
COPY ["src/BuildingBlocks/EventBus/EventBus/EventBus.csproj", "src/BuildingBlocks/EventBus/EventBus/"]
COPY ["src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj", "src/BuildingBlocks/EventBus/IntegrationEventLogEF/"]
COPY ["src/BuildingBlocks/WebHost/WebHost.Customization/WebHost.Customization.csproj", "src/BuildingBlocks/WebHost/WebHost.Customization/"]
COPY ["src/Services/Basket/Basket.API/Basket.API.csproj", "src/Services/Basket/Basket.API/"]
COPY ["src/Services/Catalog/Catalog.API/Catalog.API.csproj", "src/Services/Catalog/Catalog.API/"]
COPY ["src/Services/Identity/Identity.API/Identity.API.csproj", "src/Services/Identity/Identity.API/"]
COPY ["src/Services/Ordering/Ordering.API/Ordering.API.csproj", "src/Services/Ordering/Ordering.API/"]
COPY ["src/Services/Payment/Payment.API/Payment.API.csproj", "src/Services/Payment/Payment.API/"]
COPY ["src/Web/WebSPA/WebSPA.csproj", "src/Web/WebSPA/"]
COPY ["src/Web/WebStatus/WebStatus.csproj", "src/Web/WebStatus/"]
COPY ["docker-compose.dcproj", "./"]
COPY ["NuGet.config", "./"]
COPY ["eShopOnDapr.sln", "./"]
RUN dotnet restore "eShopOnDapr.sln" // 이 명령어를 실행함 (eShopOnDapr.sln에 있는 종속성 및 모든 도구 복원)
COPY . . // 현재까지 진행된 모든 자료를 현재 디렉토리에 복사
WORKDIR "/src/src/Services/Basket/Basket.API" // 작업경로 변경
FROM build AS publish // 위에 정의한 build를 publish로 재정의
RUN dotnet publish --no-restore "Basket.API.csproj" -c Release -o /app/publish // 뒤의 명령어를 실행함 (복원을 실행하지 않고, Basket.API.csproj 를 Release 구성으로 /app/publish 에 출력)
FROM base AS final // 위에서 정의한 base image를 final로 재정의
WORKDIR /app // 작업경로 변경
COPY --from=publish /app/publish . // publish로 부터 /app/publish 의 내용을 현재 경로에 복사
ENTRYPOINT ["dotnet", "Basket.API.dll"] // dotnet Basket.API.dll 실행
// src/Web/WebSPA/Dockerfile
ARG NODE_IMAGE=15.12.0-alpine3.12 // Node_IMAGE란 dockerfile 변수
ARG NET_IMAGE=5.0-buster-slim // NET_IMAGE란 dockerfile 변수
FROM mcr.microsoft.com/dotnet/aspnet:${NET_IMAGE} AS base // 해당 이미지를 불러오고 base라고 명명
WORKDIR /app // 디렉토리 /app으로 변경
EXPOSE 80 // 80 port를 사용함을 명시
RUN apt-get update -yq \
&& apt-get install curl gnupg -yq \
&& curl -sL https://deb.nodesource.com/setup_10.x | bash \
&& apt-get install nodejs -yq // node js를 설치함
FROM node:${NODE_IMAGE} as node-build // node base image를 불러옴
WORKDIR /web // 디렉토리 변경
COPY src/Web/WebSPA/package.json .
COPY src/Web/WebSPA/package-lock.json .
COPY src/Web/WebSPA . // 각각의 파일들을 현재의 위치에 복사
RUN npm i npm@6.14.11 -g && npm update && npm install && npm run build:prod // npm을 글로벌로 설치하고 npm 사용된 library 들을 설치하고 build 함
FROM mcr.microsoft.com/dotnet/sdk:${NET_IMAGE} AS build // base image를 불러오고 이름을 build라고 함
RUN apt-get update -yq \
&& apt-get install curl gnupg -yq \
&& curl -sL https://deb.nodesource.com/setup_10.x | bash \
&& apt-get install nodejs -yq // node js를 설치한다.
WORKDIR /src // 디렉토리 변경
COPY ["src/ApiGateways/Aggregators/Web.Shopping.HttpAggregator/Web.Shopping.HttpAggregator.csproj", "src/ApiGateways/Aggregators/Web.Shopping.HttpAggregator/"]
COPY ["src/BuildingBlocks/EventBus/EventBus/EventBus.csproj", "src/BuildingBlocks/EventBus/EventBus/"]
COPY ["src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj", "src/BuildingBlocks/EventBus/IntegrationEventLogEF/"]
COPY ["src/BuildingBlocks/WebHost/WebHost.Customization/WebHost.Customization.csproj", "src/BuildingBlocks/WebHost/WebHost.Customization/"]
COPY ["src/Services/Basket/Basket.API/Basket.API.csproj", "src/Services/Basket/Basket.API/"]
COPY ["src/Services/Catalog/Catalog.API/Catalog.API.csproj", "src/Services/Catalog/Catalog.API/"]
COPY ["src/Services/Identity/Identity.API/Identity.API.csproj", "src/Services/Identity/Identity.API/"]
COPY ["src/Services/Ordering/Ordering.API/Ordering.API.csproj", "src/Services/Ordering/Ordering.API/"]
COPY ["src/Services/Payment/Payment.API/Payment.API.csproj", "src/Services/Payment/Payment.API/"]
COPY ["src/Web/WebSPA/WebSPA.csproj", "src/Web/WebSPA/"]
COPY ["src/Web/WebStatus/WebStatus.csproj", "src/Web/WebStatus/"]
COPY ["docker-compose.dcproj", "./"]
COPY ["NuGet.config", "./"]
COPY ["eShopOnDapr.sln", "./"] // 해당 디렉토리에 앞의 내용들을 복사
RUN dotnet restore "eShopOnDapr.sln" // 명령어 실행 (eShopOnDapr.sln에 있는 종속성 및 모든 도구 복원)
COPY . . // 모든 내용을 현재 디렉토리에 복사
COPY --from=node-build /web/wwwroot /src/src/Web/WebSPA/wwwroot/ // 위 node-build image layer로 부터 /web/wwwroot 를 /src/src/Web/WebSPA/wwwroot/로 복사
WORKDIR /src/src/Web/WebSPA // 디렉토리 변경
RUN dotnet publish --no-restore -c Release -o /app // 뒤의 명령어를 실행함 (복원을 실행하지 않고, Basket.API.csproj 를 Release 구성으로 /app 에 출력)
FROM build AS publish // build image layer의 이름을 publish로 변경
FROM base AS final // base image layer의 이름을 final로 변경
WORKDIR /app // 디렉토리 변경
COPY --from=publish /app . // publish image layer로 부터 /app 의 내용물을 현재 위치에 복사
ENTRYPOINT ["dotnet", "WebSPA.dll"] // dotnet WebSPA.dll 실행
Reference
この問題について(Day2 Dockerfile), 我々は、より多くの情報をここで見つけました https://velog.io/@miiunii/Day2-Dockerfileテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol