プロジェクト構造が原因で、大きなdockerビルドコンテキストの問題に直面しています。私のルートディレクトリには、一般的なコード用のlibフォルダーとマイクロサービスのフォルダーがあります。次に、miscroservice1をビルドしてlibフォルダーのみを含め、他のマイクロサービスを無視したいと思います。
ルートフォルダーでdocker buildコマンドを実行しています。マイクロサービスフォルダーでコマンドを実行すると、ビルドコンテキスト外のエラーForbidden pathが表示されるためです。
rootFolder
-- lib
-- microservice1/Dockerfile
-- microservice2/Dockerfile
-- microservice3/Dockerfile
私には2つの解決策がありますが、今のところ試していません
上記の2つの解決策を試しています。誰かがベストプラクティスを提案できますか?
使用しているツールが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
コマンドをどの程度自動化するかによって異なります。