0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dockerの設定の一部を別ファイルに切り出す

Posted at

Dockerfileを書く過程で、共通して使う一部分を別ファイルに切り出す、という手法が有用だなと感じてきました。

問題となった状況

Dockerfileを書いているところで、「環境によって効率的なキャッシュのさせ方が違ってくるので、レイヤの順序を入れ替えたい」「複数のDockerfileに分割している1」などの事情があり、単純にレイヤを積み重ねるだけではなく、同じ動作をさせるレイヤを別々に書きたくなった、という状況が発生しました。

もちろん、そのまま複数箇所に書いても動作はするのですが、同じ設定を何度も行うというのは、あとあとの保守管理上を考えると好ましい選択肢ではありません。

ファイルに書き出したものを回収する

そこで、「必要な設定だけ別ファイルに書き出す」という手法が考えられます。書き出した設定を取り込む方法については、以下のような方法が考えられます。

  • 実行するコマンドの行に`cat path/to/file`のように混ぜ込んで置き換えを行う(バージョン番号など値が1つの場合)
  • xargs some_command < path/to/fileのようにxargsを使ってファイルリストをコマンドリストに展開する(パッケージマネージャに与えるインストールするパッケージのリストなど)
  • シェルスクリプトを書いてそれを実行する

ファイルはどう導入する?

ファイルに書いたものの使い方はいいとして、そのファイルをどのようにDockerイメージ内から参照させればいいのでしょうか。

もちろん、COPYで導入してもいいのですが、ファイルがレイヤとして残ることとなりますし、最終イメージにファイルが残るのを気にするなら改めて消す必要が出てきます。

ここで有用なのがRUN --mount=type=bindです。このmountを使ってRUNに導入したファイルは、RUNの作ったレイヤ内に残らないので、設定のみに使う一時ファイルを流すにはぴったりです。

RUN --mount=type=bindの詳細について

  • マウントできるものはフォルダに限られず、1ファイルだけマウントすることも可能です。
    • 特に、この記事のように1ファイルを参照したい場合は、そのファイルだけマウントしたほうがいいです(余計なファイルまでマウントすると、そちらもキャッシュの有効判定に組み込まれて、キャッシュが無駄に無効化されることとなります)。
  • fromを明示すれば、ビルドコンテキストだけでなく、他のステージやイメージをマウントすることも可能です。
  • rw=trueとして、マウント後に書き込みを許可することもできます。ただし、書き込んだ内容は次のステージに残らない、というのは同じです。

参照

脚注

  1. このような場合、少し前に正式リリースされたdocker bakeの利用についても考慮の余地はあります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?