1. 概要

Docker ビルドコンテキストは、特定のパスまたはURLにあるファイルまたはフォルダーで構成されます。 ビルド中に、これらのファイルはDockerデーモンに送信され、イメージがそれらをファイルとして使用できるようになります。

このチュートリアルでは、Dockerビルドコンテキストとそれに関連する問題について学習します。 イメージをビルドするためのビルドコンテキストを減らすためのさまざまな方法を検討します。

2. Dockerビルドコンテキストを理解する

この問題に進む前に、まずDockerビルドコンテキストとその動作を理解しましょう。 Dockerビルドコンテキストは、 docker build を実行したときにDockerエンジンにアクセスできるファイルとディレクトリのコレクションであり、ビルドコンテキストの一部ではないものは、[ X241X]Dockerfile。

場合によっては、DockerCLIとDockerEngineが同じマシンで実行されていない可能性があります。 docker build の間、DockerCLIはイメージをビルドするためにファイルをDockerエンジンに送信します。

GITリポジトリのURLをビルドコンテキストとして使用することもできます。 その結果、ビルドコンテキストは指定されたgitリポジトリのコンテンツになります。

3. 問題を理解する

イメージをビルドする際のビルドコンテキストに関連する問題を理解します。 ビルドコンテキストの問題をさらに理解するために、例を挙げてサンプルのDockerfileを作成しましょう。

FROM   centos:7
MAINTAINER [email protected]
COPY jdk-8u202-linux-x64.rpm / 

イメージをビルドするには、次のコマンドを実行する必要があります。

$ docker build -t javaapplication .

上記のコマンドの出力:

Sending build context to Docker daemon  178.4MB
Step 1/3 : FROM   centos:7
 ---> eeb6ee3f44bd
Step 2/3 : MAINTAINER [email protected]
 ---> Using cache
 ---> 4c798858cf11
Step 3/3 : COPY jdk-8u202-linux-x64.rpm /
 ---> Using cache
 ---> 9c58f775bb80
Successfully built 9c58f775bb80
Successfully tagged test:latest

Dockerfileを変更せずに、サイズ186Mjdk-8u202-linux-x64.tar.gzを同じディレクトリに配置しましょう。

docker build コマンドを実行すると、次の出力が得られます。

Sending build context to Docker daemon  372.5MB
Step 1/3 : FROM   centos:7
 ---> eeb6ee3f44bd
Step 2/3 : MAINTAINER [email protected]
 ---> Using cache
 ---> 4c798858cf11
Step 3/3 : COPY jdk-8u202-linux-x64.rpm /
 ---> Using cache
 ---> 9c58f775bb80
Successfully built 9c58f775bb80
Successfully tagged test:latest

ここでは、Dockerfileに変更を加えていないにもかかわらず、Dockerデーモンのビルドコンテキストが178.4MBから372.5MBに増加したことがわかります。

Dockerビルドコンテキストの重要なポイントの1つは、現在の作業ディレクトリのすべてのファイルとフォルダーが再帰的に含まれ、それらがDockerデーモンに送信されることです。

4. 。dockerignoreファイルを使用した解決策

Dockerビルドコンテキストを減らすため。 .dockerignore ファイルを使用して、ビルドコンテキストの問題を解決できます。

Docker CLIは、コンテキストのルートディレクトリで.dockerignoreという名前のファイルを検索してから、Dockerデーモンに送信します。ファイルが存在する場合、CLIはそのパターンに一致するディレクトリとファイルを除外します。 これにより、大きなファイルや機密性の高いディレクトリがDockerデーモンに不必要に送信されるのを防ぐことができます。

ここでは、ビルドの作成時に無視するために、jdk-8u202-linux-x64.tar.gzファイルを.dockerignoreファイルに追加します。

$ echo "jdk-8u202-linux-x64.tar.gz" > .dockerignore

Dockerイメージを作成しましょう:

$ docker build -t baeldung  .
Sending build context to Docker daemon  178.4MB
Step 1/3 : FROM   centos:7
 ---> eeb6ee3f44bd

ここでは、Dockerデーモンに送信されるDockerビルドコンテキストが372.5MBから178.4MBに削減されていることがはっきりとわかります。

5. EOFファイル作成の使用

EOFでdockerbuild コマンドを使用して、Dockerfileを直接作成します。

次のDockerfileを想定します。

FROM   centos:7
MAINTAINER [email protected]
RUN echo "Welcome to Bealdung"

上記のDockerfileのイメージをビルドします。 docker build コマンドを実行すると、次の出力が得られます。

$ docker build -t baeldung .
Sending build context to Docker daemon  372.5MB
Step 1/3 : FROM   centos:7
 ---> eeb6ee3f44bd
Step 2/3 : MAINTAINER [email protected]
 ---> Using cache
 ---> a7088e6a3e53
Step 3/3 : RUN echo "Welcome to Bealdung"
 ---> Using cache
 ---> 1fc84e62de75
Successfully built 1fc84e62de75
Successfully tagged baeldung:latest

ここでは、Dockerデーモンに送信されるDockerビルドコンテキストが372.5MBであることがわかります。 次の方法を使用して同じDockerfileを実行する場合:

$ docker build -t test -<<EOF
FROM   centos:7
MAINTAINER [email protected]
RUN echo "Welcome to Bealdung"
EOF

上記のコマンドの出力は次のとおりです。

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM   centos:7
 ---> eeb6ee3f44bd
Step 2/3 : MAINTAINER [email protected]
 ---> Using cache
 ---> a7088e6a3e53
Step 3/3 : RUN echo "Welcome to Bealdung"
 ---> Running in 6240c486fcb5
Welcome to Bealdung
Removing intermediate container 6240c486fcb5
 ---> 1fc84e62de75
Successfully built 1fc84e62de75
Successfully tagged baeldung:latest

ここでは、ビルドコンテキストが 372 MBから2.048KBに削減されていることがわかります。このソリューションは、COPYとADDを使用していない場合にのみ機能します。コマンド。

6. Dockerイメージの最適化

次に、既存のDockerイメージを最適化するさまざまな方法について説明します。 画像現像の最も難しい面は、画像サイズをできるだけ小さく保つことです。 Dockerfileのすべての命令は画像にレイヤーを追加するため、次のレイヤーに移動する前に、不要なアーティファクトを削除する必要があります。

非常に効率的なDockerfileを作成するには、従来、シェルトリックやその他のロジックを使用して、レイヤーを可能な限り小さくし、各レイヤーに前のレイヤーから必要なアーティファクトを確保する必要がありました。

6.1. マルチステージビルドの使用

マルチステージビルドでは、単一のDockerfileで複数のFROMステートメントを使用します。 すべてのFROM命令は異なるベースを使用し、すべてのFROM命令はビルドの新しい段階を開始します。 アーティファクトは、あるステージから別のステージに選択的にコピーできます。

Dockerfileでマルチステージを使用する例を見てみましょう。

FROM centos:7 as builder
RUN yum -y install maven
COPY spring-boot-application /spring-boot-application
WORKDIR /spring-boot-application/
RUN mvn clean package -Dmaven.test.skip=true
FROM centos:7
RUN yum install -y epel-release \
    && yum install -y maven wget \
    && yum -y install java-1.8.0-openjdk \
    && yum clean all 
COPY --from=builder /spring-boot-application/target/spring-boot-application-0.0.1-SNAPSHOT.jar /
CMD ["java -jar ","-c","/spring-boot-application-0.0.1-SNAPSHOT.jar && tail -f /dev/null"]

ここで、上記のDockerfileでは、2つのFromステートメントを使用しました。 最初に、最初のレイヤーで mvn コマンドを使用して、spring-boot-application-0.0.1-SNAPSHOT.jarをビルドしました。 次に、“ COPY –from = builder” コマンドを使用して、2番目のレイヤーで同じjarファイルを使用しました。 このようにして、最初のレイヤーを削除し、サイズを大幅に縮小できます。

6.2. ステージ数を減らす

イメージを構築するときは、Dockerfileによって作成されたレイヤーに注意を払う必要があります。 RUNコマンドは、実行ごとに新しいレイヤーを作成します。 レイヤーを組み合わせることで画像サイズを小さくすることができます。

通常、ユーザーは次のようなコマンドを実行します。

RUN apt-get -y update
RUN apt-get install -y python

上記のDockerfileは2つのレイヤーを作成します。 ただし、両方のコマンドを組み合わせると、最終的な画像に単一のレイヤーが作成されます。

RUN apt-get -y update && apt-get install -y python

したがって、コマンドのスマートな組み合わせにより、画像が小さくなる可能性があります。

6.3. カスタムベースイメージを作成する

Dockerは画像をキャッシュします。 同じレイヤーのインスタンスが複数ある場合は常に、レイヤーを最適化してカスタムベースイメージを作成する必要があります。 読み込み時間が短縮され、追跡が容易になります。

7. 結論

このチュートリアルでは、Dockerのビルドコンテキストの概念について学びました。 最初に、Dockerビルドコンテキストの詳細と実行について説明しました。

次に、 dockerbuildコマンドを使用してDockerイメージを作成する際のビルドコンテキストの増加の問題に対処しました。 まず、問題のユースケースを調査し、Dockerでさまざまな方法を使用してそれらを解決しました。

最後に、Dockerイメージを最適化するためのさまざまなアプローチを検討しました。