PodmanとDockerfileのメモ
Dockerfileには初心者には結構落とし穴的な注意点があります。はまった所をメモってみます。


WORKDIRはホストマシンの?構築中のコンテナの?
超初心者なんでこんな所からつまずいてしまいました。
DockerfileのWORKDIRで指定する位置は、podman buildを実行しているホストマシン上のディレクトリ? それとも構築中のコンテナの中のディレクトリ?
答えは後者。構築中のコンテナ内部のディレクトリを指定するコマンドです。


COPYとADDの違い
COPYは単純なファイルのコピーです。それ以上言うことはない処理です。
ADDの場合は、.tar.gzなどのアーカイブファイルを対象にすると自動で展開して配置されます。 またhttpやhttps等のリモートURLを指定するとそれを取得することもできます。
ちなみにADDは.zipファイルは展開してくれません。初心者はそんな所から勉強なのじゃ…


CMDとENTRYPOINTの違い
CMDはpodman run実行時に実行されるデフォルトのコマンドラインを記述します。 引数を取ることができ、実行時のオプションで上書きできます。 テストやデバッグ用途にも使われることを意図します。
ENTRYPOINTは、podman run時に必ず実行されるプログラムを記述します。 通常、コンテナの中心機能を記述し、コマンドラインで上書きされない正式な処理であることを意図します。


COPY先のディレクトリは先に作っておく必要がある?
ありません。COPY命令ではコピー先のディレクトリが存在しない場合自動で作ってくれます。
先にmkdirで作っておく必要はありません。


COPYで親ディレクトリへ辿れない

COPY ../bin/app.jar /bin

とDockerfileに書くとなぜか「/bin/app.jar」が見つからないというエラーになります。
これはCOPYやADDでは「..」が効かない、つまりDockerfileがあるディレクトリから親方向に辿れないためです。
回避する方法もあるようですが、素直に必要なファイルを全てDockerfileから下に配置してビルドした方がいいかもしれません。


CMDで環境変数が展開されない

ENV APP_DIR=/usr/local/share
CMD ["java", "-jar", "${APP_DIR}/app/test-1.0.jar"]

とDockerfileに書くと「${APP_DIR}/app/test-1.0.jar」が見つからないというエラーになります。
マニュアルにも言及がありますが、CMDやENTRYPOINT の[]内では環境変数は展開されません。 むむー。

Misc. Topics Top

(first uploaded 2024/08/09 last updated 2024/09/14, URANO398)