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
ファイルを作成できます。完了すると、ファイル構造は次のようになります。
app.py
ファイルに進み、アプリケーションを作成できます。このアプリケーションには、以下に示すように、コンソールメッセージを出力する単純な関数が含まれています。
from flask import Flask
app = Flask(__name__)
def hello():
print("Hello, this is a simple Flask application")
hello()
上記のコードを実行したときに期待される結果は次のとおりです。
次に、Docker がイメージを構築するために使用するコマンドを Dockerfile に入力します。これらのコマンドは、Docker コンテナーを実行するときに実行されます。
この場合、ベースイメージとして Python を使用します。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 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 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