web-dev-qa-db-ja.com

Dockerビルドコンテキストで送信するフォルダーを無視する方法

プロジェクト構造が原因で、大きなdockerビルドコンテキストの問題に直面しています。私のルートディレクトリには、一般的なコード用のlibフォルダーとマイクロサービスのフォルダーがあります。次に、miscroservice1をビルドしてlibフォルダーのみを含め、他のマイクロサービスを無視したいと思います。

ルートフォルダーでdocker buildコマンドを実行しています。マイクロサービスフォルダーでコマンドを実行すると、ビルドコンテキスト外のエラーForbidden pathが表示されるためです。

rootFolder
-- lib
-- microservice1/Dockerfile
-- microservice2/Dockerfile
-- microservice3/Dockerfile

私には2つの解決策がありますが、今のところ試していません

  1. マイクロサービスフォルダーにlibのシンボリックリンクを追加するには
  2. 各Dockerビルド用のスクリプトを記述して、特定のマイクロサービスフォルダーにlibフォルダーを追加し、Dockerビルドを実行します。

上記の2つの解決策を試しています。誰かがベストプラクティスを提案できますか?

3
Ibtesam Latif

使用しているツールがDockerだけの場合、選択肢はあまりありません。重要な問題は、.dockerignoreファイルが1つしかないことです。つまり、常にプロジェクトのルートディレクトリをDockerコンテキストディレクトリ(すべてのサービスのソースを含む)として使用する必要がありますが、Docker内で使用する特定のDockerfileを指定できます。 (この場合、すべてのCOPYディレクティブはrootFolderに関連することに注意してください。)

docker build rootFolder -f microservice1/Dockerfile -t micro/service1:20190831.01

多くの言語では、ライブラリ(C .a.h、および.soファイル]をパッケージ化する方法があります。Java .jarファイル; Python wheels; ...)。言語がそれをサポートしている場合、別のオプションはライブラリをビルドしてから、ライブラリを各サービスのビルドツリーに(シンボリックリンクではなく)コピーすることです。Pythonのホイール形式を使用する例として:

pip wheel ./lib
cp microlib.whl microservice1
docker build microservice1 -t micro/service1:20190831.01
# Dockerfile needs to
# RUN pip install ./microlib.whl

これのもう1つの便利なバリエーションは、手動のマルチステージビルドです。 lib/Dockerfileでベースイメージを選択し、そのベースイメージにライブラリをインストールすることができます。次に、各サービスのDockerfileがライブラリイメージを開始FROMし、プリインストールされます。例としてCライブラリを使用する:

# I am lib/Dockerfile

# Build stage
FROM ubuntu:18.04 AS build
RUN apt-get update && apt-get install build-essential
WORKDIR /src
COPY ./ ./
RUN ./configure --prefix=/usr/local && make
# This is a typical pattern implemented by GNU Autoconf:
# it actually writes files into /src/out/usr/local/...
RUN make install DESTDIR=/src/out

# Install stage -- service images are based on this
FROM ubuntu:18.04
COPY --from=build /src/out /
RUN ldconfig
# I am microservice1/Dockerfile
ARG VERSION=latest
FROM micro/lib:${VERSION}
# From the base image, there are already
# /usr/local/include/microlib.h and /usr/local/lib/libmicro.so
COPY ...
RUN gcc ... -lmicro
CMD ...

また、ビルドされたライブラリをサーバーにアップロードするオプションも(言語とそのパッケージシステムに応じて)あります。 (たとえば、Python pip requirements.txtファイルには、ホイールの任意のHTTP URLを含めることができます。)これを行うと、ライブラリを通常の依存関係として宣言できます。この問題はなくなります。

これらのうちどれが適切に機能するかは、言語とランタイム、および複数の調整されたdocker buildコマンドをどの程度自動化するかによって異なります。

1
David Maze