Docker でイメージのクリーンビルドを強制する

Isaac Tony 2023年1月30日
  1. Docker でイメージを構築する
  2. Docker で --no-cache オプションを使用してイメージのクリーンビルドを強制する
Docker でイメージのクリーンビルドを強制する

チュートリアルでは、Docker でイメージのクリーンビルドを強制する方法について説明し、デモンストレーションします。

Docker でイメージを構築する

この概念を示すために、単純な Flask アプリケーションを使用します。以下のコマンドを使用して、メインフォルダーmy-app 内に app.py という名前の単純なアプリケーションを作成します。

touch app.py

コマンドを使用していない場合は、Python 3 をインストールします。

sudo apt update && sudo apt install python3-venv

コマンドを使用して Flask と Gunicorn をインストールすることもできます。

pip install flask gunicorn

コマンド touch Dockerfile を使用して、Docker ファイルの作成に進みます。Docker ファイルの作成を簡単にするために、requirements.txt ファイルを作成します。

pip freeze > requirements.txt コマンドを実行することで、requirements.txt ファイルを作成できます。完了すると、ファイル構造は次のようになります。

コンテナ化された Docker アプリケーションのファイル構造

app.py ファイルに進み、アプリケーションを作成できます。このアプリケーションには、以下に示すように、コンソールメッセージを出力する単純な関数が含まれています。

from flask import Flask

app = Flask(__name__)

def hello():

    print("Hello, this is a simple Flask application")

hello()

上記のコードを実行したときに期待される結果は次のとおりです。

Flask アプリケーションを実行したときのコード結果

次に、Docker がイメージを構築するために使用するコマンドを Dockerfile に入力します。これらのコマンドは、Docker コンテナーを実行するときに実行されます。

この場合、ベースイメージとして P​​ython を使用します。Dockerfile は次のようになります。

# base image
FROM python

# Set your working directory
WORKDIR /var/www/

# Copy the necessary files
COPY ./app.py /var/www/app.py
COPY ./requirements.txt /var/www/requirements.txt

# Install the necessary packages
RUN pip install -r /var/www/requirements.txt

# Run the app
CMD python3 app.py

Dockerfile の準備ができたら、それを保存して、テスト用にローカルでイメージを構築できます。 -t タグと一緒に docker build コマンドを使用できます。

Docker 内でのイメージビルド

次に、以下に示すように、docker run コマンドを使用してイメージをテストできます。

(myapp) isaac@DESKTOP-HV44HT6:~/my-app$ docker run -it myapp
Hello, this is a simple Flask application

docker ps コマンドを使用して、新しいコンテナが正常に構築されたことを確認します。

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
dd10c9a6a8a1   myapp     "/bin/sh -c 'python3…"   11 minutes ago   Exited (0) 10 minutes ago             vigilant_brattain

Docker で --no-cache オプションを使用してイメージのクリーンビルドを強制する

このイメージを使用してコンテナーを作成したので、同じイメージを使用してイメージを再度作成するとします。その場合、docker デーモンはイメージレイヤーの既存のキャッシュを使用してイメージを構築します。

ただし、--no-cache オプションを使用して、Docker でクリーンなイメージビルドを強制することができます。これは、Docker デーモンのデフォルトの動作をオーバーライドします。

これを実装する方法は次のとおりです。

myapp) isaac@DESKTOP-HV44HT6:~/my-app$ docker build --no-cache -t myapp .
[+] Building 119.0s (10/10) FINISHED
 => [internal] load .dockerignore                                                                                                1.6s
 => => transferring context: 2B                                                                                                  0.4s
 => [internal] load build definition from Dockerfile                                                                             2.1s
 => => transferring dockerfile: 38B                                                                                              0.4s
 => [internal] load metadata for docker.io/library/python:latest                                                                37.9s
 => [1/5] FROM docker.io/library/python@sha256:ee0b617025e112b6ad7a4c76758e4a02f1c429e1b6c44410d95b024304698ff2                  0.1s
 => [internal] load build context                                                                                                0.4s
 => => transferring context: 63B                                                                                                 0.0s
 => CACHED [2/5] WORKDIR /var/www/                                                                                               0.1s
 => [3/5] COPY ./app.py /var/www/app.py                                                                                          1.3s
 => [4/5] COPY ./requirements.txt /var/www/requirements.txt                                                                      2.2s
 => [5/5] RUN pip install -r /var/www/requirements.txt                                                                          68.4s
 => exporting to image                                                                                                           4.8s 
 => => exporting layers                                                                                                          3.8s 
 => => writing image sha256:ee771b73a9ec468308375d139a35580f6c7f62988db9c0bb0b85794716406e92                                     0.1s 
 => => naming to docker.io/library/myapp

docker run コマンドを使用して新しいコンテナを作成できます。

(myapp) isaac@DESKTOP-HV44HT6:~/my-app$ docker run -it myapp
Hello, this is a simple Flask application

以下に示すように、新しいコンテナを正常にビルドし、--no-cache オプションを使用して Docker にイメージのクリーンビルドを強制しました。

$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS     NAMES
826b8de2c92f   myapp          "/bin/sh -c 'python3…"   47 seconds ago   Exited (0) 39 seconds ago             kind_pike
dd10c9a6a8a1   ba84c5d3b157   "/bin/sh -c 'python3…"   28 minutes ago   Exited (0) 28 minutes ago             vigilant_brattain
著者: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

関連記事 - Docker Image