【Docker】Docker hub上のimageをpullし、参照先のDockerFileの仕様把握
【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を覗いてみました。
むずかしい(笑)
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