📚

【Docker】Docker hub上のimageをpullし、参照先のDockerFileの仕様把握

2024/10/12に公開

【Docker】最小限の仕様確認 https://zenn.dev/jun202407060017/articles/c21bd3a9be8cfb
の時に、chatGPTに甘え、シンプルなコンテナを立ち上げました。その中で作成されたDockerfileを自作できるように、この記事で補填できたらと思います。

docker --version

でバージョンが表示される状態で、docker hubへアクセスします。(最初にアカウント作成などあります。)
docker hub https://hub.docker.com/

そのdocker hub上にはすでに作成済のimageがあるため、実用レベルで作成されたDockerfileと見比べながら、実際にDockerfileが自作できる、扱えるレベルまで頑張りたい・・といった目標となります。

pythonファイルをdocker hub上で適当に探してみます。
こちらを見つけました。 https://hub.docker.com/_/python
そこに

Quick reference (cont.)
Where to file issues:

とあり、下記のgithubを見つけたので、AWSのEC2インスタンスで利用できるlinux系統のDockerfileを覗いてみました。
https://github.com/docker-library/python/blob/master/Dockerfile-linux.template

むずかしい(笑)

200行ほどですが、今理解できそうにないですね。笑
今わかるのは、最後の

CMD ["python3"]

は理解できました。

実行時に、python3というコマンドを実行する、といった意味だと思うのですが、なぜ実行するのかまでは現状不明です。最小限の仕様把握の記事の一番最後にも、

# コンテナが起動する際に実行されるコマンド
CMD ["python", "app.py"]

と記述があり、実行するコマンドを引数的にとっていないため、不明です。

なので、一旦置いておきます。

上記のアプローチだと、技術スタックに差がありすぎるため、次のアプローチをぼんやり考えていたところ、上記のページのさらに下の方に、この記述を見つけました。

FROM python:3

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD [ "python", "./your-daemon-or-script.py" ]

こちらの把握から、この記事では行おうと思います。(導入終了・・)

疲れてきたので、chatGPT様へ甘えます・・

FROM python:3

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD [ "python", "./your-daemon-or-script.py" ]
を解説して

4つ目の下記のコードを取り上げます。

RUN pip install --no-cache-dir -r requirements.txt

RUN自体は、コマンドを走らせるイメージですが、後ろのコマンド、
「--no-cache-dir」が見慣れないため、ChatGPTを頼りました。

pip install --no-cache-dir -r requirements.txt コマンドの
--no-cache-dir オプションは、インストール中にキャッシュを作成
しないようにするためのオプションです。通常、pip はパッケージを
ダウンロードすると、それらをキャッシュに保存します。
これにより、将来的に同じパッケージを再インストールする場合に、ダウンロードを
スキップしてキャッシュからインストールすることができます。
--no-cache-dir オプションを使用すると、このキャッシュを作成せず、
毎回インターネットから新たにパッケージをダウンロードします。

ここで、「--no-cache-dir」は、不要な処理をカットするとわかりました。

最初、「--no-cache-dir」オプションをつけなければ、1回目にDockerfileが走ってから、2回目にDockerfileが走る時までの間に、pipのバージョンアップが行われれば、キャッシュに残った以前のバージョンのpipがインストールをされるため、過去バージョンのpipがインストールされる状況ができると思いました。しかし、コンテナの構築の処理が走るのは最初の一回のみで、キャッシュがそもそも残っている、いないは関係なく、キャッシュでなく、適切な参照先から確実にpipがインストールされるのでは?

そう考えると「--no-cache-dir」は必要だとわかりました。

大体コマンドの意味通りだったのですが、

COPY . .

だけ、ちょっと仕様が絡んでいそうなので、詳細を確認すると、

COPY . .
意味: ローカルのカレントディレクトリ (.) の内容すべてを、コンテナの現在の作業ディレクトリ (/usr/src/app) にコピーします。
理由: このコマンドで、アプリケーションのコードや他の必要なファイル(例: スクリプト、設定ファイルなど)をコンテナ内にコピーして、実行できるようにします。

なるほど。

COPY ローカルのディレクトリ container内のディレクトリ

なのだなと。

.

はカレントディレクトリ、今いるディレクトリの位置を表すので、

COPY . .

は「今いるローカルのディレクトリ」から「コンテナ内のディレクトリ」へ「COPY」コマンドを行うのだなと。
ということは、

COPY . の処理で「今いるディレクトリの位置をpwdする処理+ローカルを指定する処理?」を行なっていて、
COPY . .のコマンドを実行する時に、「今いるディレクトリの位置をpwdする処理+containerを指定する処理?」があるのではないか、と思いました。

上記の仕様を把握できた点で、この記事を書いて良かったと思います。
次回以降、実際に作成したいcontainerから、逆算してDockerfileを作成できることを目標に、いくつかのcontainerを作成していきます。

Discussion