圧縮イメージボリュームの多段階構築
上記で使用した公式Pythonイメージのサイズはフル882MBですが、これに使用したサードパーティライブラリをインストールし、プロジェクトに必要な画像などのリソースを追加すると、そのサイズはゆうに1Gを超えることもあります。大きな画像、ネットワーク送信はお客様にとって非常に不便ですので、画像のサイズを小さくすることが非常に必要です。
Docker Hub には python:3.8-alpine イメージがありますが、サイズはわずか 44.5MB です。サイズが小さい理由は、alpine が組み込みアプリケーションで一般的に使用されるビジーボックス アーキテクチャを使用したオペレーティング システムであるためです。このミラーを使ってみたところ、一般的なライブラリをインストールするのは大丈夫ですが、numpyなどをインストールしたい場合は難しく、インターネット上でも解決策が見つかりません。
それでも基本的なルート、つまり主流のオペレーティング システム イメージに戻り、ubuntu のサイズは 72.9 MB、centos のサイズは 209 MB です。これは、私が ubuntu を使用することを好む重要な理由でもあります。ubuntuをベースイメージにすると、pythonインストール後のサイズは139MB、pipインストール後のサイズは一気に407MBまで上昇し、他のものをインストールすると公式のPythonイメージのサイズに簡単に追いつくか超えてしまいます。
通常の方法では画像ファイルのサイズを圧縮するのは難しいようです。幸いなことに、多段工法というカーブで国を救う方法がまだあります。
多段階構築の考え方は実は非常にシンプルで、まず大きく完成したイメージを構築し、そのイメージの有用な部分だけを取り出して新しいイメージに配置するというものです。このシナリオでは、pip はイメージの構築プロセス中にのみ必要ですが、プログラムの実行にはまったく役に立ちません。pip をインストールし、次に pip を使用してサードパーティ ライブラリをインストールし、このミラーからサードパーティ ライブラリを Python のみで pip を含まないミラーにコピーするだけで、pip が占有する 268MB のスペースを節約できます。 。
1. ubuntu イメージに基づいて Python をインストールします。
FROM ubuntu
RUN apt update \
&& apt install python3
次に、次を実行します。
docker build -t python:3.8-ubuntu .
このようにして、python:3.8-ubuntu イメージが生成されます。
2. python:3.8-ubuntu に基づいて pip をインストールします。
FROM python:3.8-ubuntu
RUN apt install pip
次に、次を実行します。
docker build -t python:3.8-ubuntu-pip .
このようにして、python:3.8-ubuntu-pip イメージが生成されます。
3. 多段階ビルドのターゲット イメージ:
FROM python:3.8-ubuntu-pip
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
FROM python:3.8-ubuntu
COPY --from=0 /usr/local/lib/python3.8/dist-packages/ /usr/local/lib/python3.8/dist-packages/
この dockerfile には 2 つの FROM コマンドがあるため、説明する必要があります。
最初のものは、python:3.8-ubuntu-pip イメージに基づいており、numpy をインストールします。もちろん、実際のアプリケーションでは、使用されるすべてのサードパーティ ライブラリをここに記述します。
2 番目の FROM は、FROM python:3.8-ubuntu イメージに基づいており、すべてのサードパーティ ライブラリがコピーされます。COPY コマンドの後の –from=0 は、ステージ 0 からコピーすることを意味します。実際のアプリケーションでは、コンテキストからプログラム コードをコピーし、必要な ENTRYPOINT などを追加します。
最後に、もう一度実行します。
docker build -t project:1.0 .
もちろん、プロジェクトのイメージは準備ができています。公式の Python ミラーを使用してビルドされたバージョンよりも約 750MB 小さくなります。
イメージを実稼働環境にインポートする
この時点でイメージは作成されましたが、イメージ ファイルはどこにあるのでしょうか?また、それを実稼働環境で実行するにはどうすればよいでしょうか? 先ほど docker image コマンドを使用したところ、生成されたイメージが表示されました。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello 1.0 01fe19111dc7 59 minutes ago 893MB
python 3.8 f5041c8ae6b1 13 days ago 884MB
ubuntu 20.04 f643c72bc252 5 weeks ago 72.9MB
hello-world latest bf756fb1ae65 12 months ago 13.3kB
docker save コマンドを使用して、指定したファイルにイメージを保存できます。保存されたファイルは .tar 形式の圧縮ファイルです。
docker save -o hello.tar hello:1.0
hello.tar を実稼働環境のマシンにコピーし、インポート コマンドを実行します。
docker load -i hello.tar
すぐに使用できます。