🕌

dockerfileのCOPYでゴミファイルが入るのを防ぐ

2023/05/21に公開

DockefileのCOPY命令を使う際にゴミデータを一緒にコピーしてしまうという問題の回避策をまとめます。

DockerfileのCOPYの簡単な説明

COPYはホスト環境のデータをdockerイメージにコピーする記法です。

FROM python:alpine3.18

# ホスト環境file.pyをdockerイメージにコピー
COPY file.py /home/

WORKDIR /home

ファイルでなくディレクトリをコピーすることもできます。

FROM python:alpine3.18

# ホスト環境のscriptsディレクトリをdockerイメージの/home/scriptsへコピー
COPY scripts /home/scripts/

WORKDIR /home

ゴミデータが交じるケース

ディレクトリをコピーするときにディレクトリの中にうっかりゴミが混じっている場合、イメージの中にもゴミが入ってしまいます。
例として、scriptsの中にpythonが入っている場合だと(__pycache__)[https://peps.python.org/pep-3147/#proposal]が入ってしまうことがあります。
また、Macで開発している人は.DS_Storeが入ることもあるでしょう。

ゴミデータを入れないようにする方法を2つ書きます。

方法1: Dockerfileにコピー対象ファイルを明確に書く

ディレクトリをコピーするのでなく、コピー対象のファイルを明確に書くという方法があります。

FROM python:alpine3.18

# ホスト環境のscriptsにあるpyファイルをdockerイメージの/home/scripts/へコピー
COPY scripts/*py /home/scripts/

WORKDIR /home

方法2: .dockerignoreを使う

Dockerfileを下記のように記載したうえで、.dockerignoreというファイルを作ることで、ゴミデータをコピー対象から外すことができます。

  • Dcokefile
FROM python:alpine3.18

# ホスト環境のscriptsディレクトリをdockerイメージの/home/scriptsへコピー
COPY scripts /home/scripts/

WORKDIR /home
  • .dockerignore
scripts/__pycache__
scripts/.DS_Store

このように書けば、scriptsの中の__pycache__.DS_Storeを外すことができます。
.dockerignoreというファイルは、Dockerfileと同じ階層に作ります。

また以下のように.dockerignoreを書けばより汎用的に対処できます。

# binディレクトリのコピー対象をpyファイル限定にする
scripts
!scripts/*py

このようにすれば、__pycache__.DS_Store以外のゴミデータがscriptsの中に混じっていてもコピー対象から外すことができます。

まとめ

Dockefileの命令にCOPY命令時にゴミデータをいれないよにする方法をまとめました。
方法1と方法2のどちらがよいかはケースにもよると思います。

Discussion