Dockerを使用したコピー(ただし、除外あり)


231

Dockerfileでは、

COPY . .

ディレクトリー全体(私の場合はnode_modulesディレクトリー)を除外したい。

このようなもの:

   COPY [all but **/node_modules/**] .

これはDockerで可能ですか?


23
いかが.dockerignoreですか?
Anthony Sottile 2017年

:私はこの関連の質問への答えを探していますstackoverflow.com/questions/50547489/...
アレクサンダー・ミルズ

回答:


377

ファイルを作成し.dockerignore、その中に1行で(ので、この場合は、最も可能性の高いnode_modulesに親であるディレクトリ)あなたのドッキングウィンドウのビルドコンテキストのディレクトリに:

**/node_modules

おそらくあなたはおそらくただ:

node_modules

dockerignoreに関する情報:https ://docs.docker.com/engine/reference/builder/#dockerignore-file


5
おかげで、「コピー...」コマンドは変更する必要はないと思います
アレクサンダーミルズ

そうではない:/config/nginx/ /config/logstash/、私はこれをコンテナbashで見つけます:ls config/ gunicorn logs logstash nginx
SalahAdDin

3
@SalahAdDinは、あなたが書いていないのと同じ理由で、ls /config/これらのパスを.dockerignoreに追加せずに先頭に付け/ませんか?
パブロ

8
ただ、node_modulesサブディレクトリでは動作しません。
rustyx

5
あなたがそれをコピーしたいのであれば、これは本当に問題を解決しませんが、そのレイヤーではありません...
Wes

33

.dockerignoreファイルを使用できない場合(たとえば、あるCOPYではファイルが必要だが別のCOPYでは必要ない場合):

はい。ただし、複数のCOPY命令が必要です。具体的には、除外するファイル名の文字ごとにCOPYが必要です。

COPY [^n]*    # All files that don't start with 'n'
COPY n[^o]*   # All files that start with 'n', but not 'no'
COPY no[^d]*  # All files that start with 'no', but not 'nod'

完全なファイル名を取得するまで、またはプレフィックスだけで他のファイルを取得できないと確信できるまで続行します。


1
COPY failed: no source files were specified「no」で始まるが「nod」ではないファイルがないときにを取得するため、これはワートになりません。
mheck

1
または、2つの異なるサブディレクトリ(異なるコピーターゲット用)を使用して、たとえば、nginxセットアップで、にsrc/行って/var/www/conf/nginx.conf行く必要があり/etc/nginx/conf.d/default.confます。また、すべてをコピーして、RUN rm -r conf後でソースツリーをそのままにしておくこともできます。他に提案があるかどうか知りたいのですが。
ユーバル

1
このようにすると、特定のファイルタイプまたはファイル末尾の解決策は何ですか?
Lea Reimann

このアプローチの唯一の欠点は、フォルダー構造がフラット化されることです
Islam Q.

コピーするディレクトリが少ない場合(たとえば、「/ app」または「/ src」のみ)。より簡単な方法は、ディレクトリを個別にコピーして(その構造を維持するため)、1つだけでCOPY [^node_modules]*すべての最上位ファイルをコピーすることです。
smdufb

9

私の場合、私のDockerfileにはインストール手順が含まれており、これによりvendorディレクトリが作成されます(PHPでに相当node_modules)。次に、COPYこのディレクトリを最終的なアプリケーションイメージに移動します。したがって、私はvendor私の中に入れることができませんでした.dockerignore。私の解決策は、実行する前にディレクトリを削除することでしたcomposer install(PHPのに相当npm install)。

FROM composer AS composer
WORKDIR /app
COPY . .
RUN rm -rf vendor \
    && composer install 

FROM richarvey/nginx-php-fpm
WORKDIR /var/www/html
COPY --from=composer /app .

このソリューションは機能し、最終的なイメージを膨らませることはありませんがvendor、ビルドプロセス中にホスト上のディレクトリがDockerコンテキストにコピーされ、時間がかかるため、理想的ではありません。


3
composer.lock前に削除する必要がある理由を確認してくださいcomposer install。ロックファイルがないと、次回のビルド時に別の依存関係セット(ベンダーフォルダー)がインストールされる可能性があります。
Lacek

1
@Lacek:その通りです。私はこれを投稿して以来、私はよりよく学びました。
Cameron Hudson、

1
@CameronHudsonは、人々がこの悪い習慣をコピー/貼り付ける前に、元の回答を更新するかもしれません。
ロビンファンバーレン

2

.dockerignoreを追加するとうまくいきます。1つの追加ポイントWindowsこのソリューションを試行している人は、Windowsでは.dockerignoreファイルを作成できません(デフォルトでは、で始まるファイルの作成が許可されていないため)。

で始まるこのようなファイルを作成するには。Windows上でまた、ドットエンディングが含まれ、同様に:.dockerignore.と入力してヒット(フォルダオプションからビュー拡張オプションを有効にしている提供)


6
ドットで終わるファイルをウィンドウで作成することもできます。
ジムペディッド

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.