Dockerを学び始めた初心者です。
Dockerfileでいろいろインストールするときに、DockerfileにRUNコマンドを書いて、インストールしたり、設定したりとするのがよいのか、予め実行させる処理をシェルスクリプトにまとめ、ファイルとしてCOPYコマンドでtmpなどに入れて実行させるのか、どちらが良いのでしょうか。
私としては、Dockerのコンテナはできる限り何もない状態にしておき、runするときにシェルを動かして、imageを使い回せるような形にするのが正解かと思っていたのですが、けっこうDockerfile内のRUNで設定している人も多いようで、どちらが最適なのかわかりません。
結局は、imageを使い回すような処理は書くことはなさそうだとも感じています。
良い点、悪い点など教えていただけますと幸いです。
よろしくおねがいします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
自己解決
回答のコメント欄で私の勘違いがわかったのでそちらをまとめます。
ENTRYPOINTや、CMDの処理がdocker startするたびに実行されてしまうということが理解できていませんでした。全部シェルスクリプトに書いていました。
試したところ、シェルで実行させていた処理は、毎回コンテナを立ち上げるたびに初期化されていました。
@matsuandさん
RUNはイメージビルド時に実行されるコマンド、CMDはコンテナ内にてイメージが実行される際に実行されるコマンド。利用目的が異なると思います。コンテナを再起動したときのことを考えると違いが明らかで、(変更点がなければキャッシュが効くので)再実行されなくてよいコマンドが RUN、(再)実行されて欲しいコマンドが CMD ではないですか?(CMDはイメージビルド時には実行されません。)
- 再実行されなくてよいコマンドが RUN
- (再)実行されて欲しいコマンドが CMD(CMDはイメージビルド時には実行されません。) もしくはENTRYPOINT。
シェルスクリプトにしかかけないことをシェルスクリプトに書くべきで、それ以外はDockerfileに書くべきと結論づけました。
投稿2021/03/18 14:53
総合スコア110
0
Dockerfileはdocker-composeとセットで使う事がほとんどだと思うけど、Dockerfile内では.envやdocker-compose.ymlで設定した引数を利用出来るのでRUN
の一部として利用出来ます
動的に変数を作り、それをRUN
に使う事も出来ます
対して予め用意したシェルスクリプトだとそれが出来ません
※シェルの中で環境変数・変数を作って使う事は出来ます
※RUN
でsedして書き換える事も出来ます
どちらが最適なのかわかりません。
自分のやり易いようにどうぞ
個人利用の範囲ならやり易い方法や好みの方法から始めて不都合があれば適宜手法を変えてけばいいです
ただし他の人にイメージを配布するならシェルスクリプトをエントリーポイントとしてイメージに突っ込むしかないでしょう
投稿2021/03/18 07:01
総合スコア6426
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/18 08:21
2021/03/18 08:39
2021/03/18 09:11
2021/03/18 10:26
2021/03/18 10:36
2021/03/18 10:42
2021/03/18 10:43 編集
2021/03/18 10:59
2021/03/18 11:02
2021/03/18 11:04
2021/03/18 11:06
2021/03/18 11:30
2021/03/18 12:15 編集
2021/03/18 13:15
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。