web-dev-qa-db-ja.com

Dockerは.dockerignoreのパターンを無視します

python生成されたファイルをDockerイメージから除外するつもりだったので、コンテキストディレクトリのルートに.dockerignoreを追加しました。

# Ignore generated files
*.pyc

Alas docker buildはこれを無視し、次のようなディレクトリツリー全体をコピーします。

/contextdir/
|-- Dockerfile
\-- src/
    |-- a.py   # this is copies - all right
    \-- a.pyc  # this should be ignored, but is copied too. Why?
21
Ilia Barahovski

最後に、私はトリックが何であるかを理解しました。なんらかの理由で、これについての言及を見つけることができず、そのような構造を持つDockerfileの例を見つけられなかったので、ここにドキュメント化します。それは誰にとっても些細なことでしたか?

https://docs.docker.com/engine/reference/builder/#/dockerignore-file の参照では、*.pycは、パスの最初、またはコンテキストディレクトリの直下のファイルにのみ一致しますが、再帰的には一致しません。再帰的に機能させるには、**/構文を使用する必要があります:

# Ignore generated files
**/*.pyc
49
Ilia Barahovski

。dockerignoreのドキュメント は、パターンマッチングが Goのファイルパスマッチングロジック を使用していることを示しています。ドキュメントは再帰的なパターンもカバーしています:

Goのfilepath.Matchルールの他に、Dockerは、任意の数のディレクトリ(ゼロを含む)に一致する特別なワイルドカード文字列**もサポートしています。たとえば、**/*。goは、ビルドコンテキストのルートを含むすべてのディレクトリにある、.goで終わるすべてのファイルを除外します。

6
Elton Stoneman