web-dev-qa-db-ja.com

dockerで、ただし除外してコピーする

Dockerfileで、私は持っています

COPY . .

ディレクトリ全体、私の場合はnode_modulesディレクトリを除外します。

このようなもの:

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

Dockerでこれは可能ですか?

126
Alexander Mills

Docker build contextディレクトリにファイル.dockerignoreを作成します(したがって、この場合はnode_modulesの親ディレクトリになる可能性が最も高いです)。

**/node_modules

あなたはおそらく欲しいだけですが:

node_modules

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

202
vith

.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'

完全なファイル名、または他のファイルがないことを合理的に確信しているプレフィックスだけになるまで続けます。

15
Alex

.dockerignoreを追加することは私のために働きます。もう一つのポイントWindowsでこの解決法を試している人はwindowsで.dockerignoreファイルを作成することはできません(そうではありません)デフォルトでは、tはで始まるファイルを作成できます。

そのためのコツはここに記載されています。 https://www.hanselman.com/blog/HowToCreateAFileWithADotPrefixInWindowsExplorer.aspx

これは、次のように末尾のドットも含みます。.dockerignore.およびhit enter(フォルダオプションから表示拡張オプションを有効にしている場合)

1
Paras Patidar

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

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

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

この解決策は機能し、最終イメージを肥大化させることはありませんが、構築プロセス中にホスト上のvendorディレクトリがDockerコンテキストにコピーされるため時間がかかるため、理想的ではありません。

0
Cameron Hudson