3

Web アプリケーションといくつかのワークフロー エグゼキュータがあるとします。

  • http-server (ビルド前のアセット ファイルを提供) - production
  • ビルダー (ソースからの js/css/html のコンパイル/バンドル) - デプロイ/開発
  • デバッガー/ビルダー (オンザフライでソースからビルド、js ソース マップを追加) - 開発
  • selenium (実行中のテスト) - 統合テスト

これらのワークフロー エグゼキュータを最も効果的に機能させるには、階層化されたイメージをどのように構築すればよいでしょうか? 事実上、「実行が最も速く、書き込みが最も少ない」ことを意味します。

4

1 に答える 1

1

答えは簡単かもしれません: 4 つDockerfileの s を別のものに依存するように作成するだけです。

ソースからのビルドを共有するボリュームを追加できます。問題は、結果のアセットをイメージに含めるか、毎回ソースからビルドするかです。

それぞれに 4 つのフォルダーを作成Dockerfileします。

製造

production/Dockefile:

FROM  # put server here
COPY  # put config here
# some other option
# volume sharing?

建てる

build/Dockerfile:

# install dependencies
ADD # add sources here
RUN # some building script

デバッグ

debug/Dockefile:

# ideally, configure production or build image

テスト

test/Dockefile:

FROM # import production
# install test dependencies
RUN # test runner

いくつかのオプションもあります。1. .gitignore をネガティブ パターン (または ADD?) で使用する

*
!directory-i-want-to-add
!another-directory-i-want-to-add

さらに、dockerfiles とコンテキストを指定する docker コマンドを使用します。

docker build -t my/debug-image -f docker-debug .
docker build -t my/serve-image -f docker-serve .
docker build -t my/build-image -f docker-build .
docker build -t my/test-image -f docker-test .

別の gitignore ファイルを使用することもできます。

  1. ボリュームのマウント コンテキストの送信をまったくスキップし、実行時にボリュームのマウントを使用します ( を使用-v host-dir:/docker-dir)。

したがって、次のようにする必要があります。

docker build -t my/build-image -f docker-build . # build `build` image (devtools like gulp, grunt, bundle, npm, etc)
docker run -v output:/output my/build-image build-command # copies files to output dir
docker build -t my/serve-image -f docker-serve . # build production from output dir
docker run my/serve-image # production-like serving from included or mounted dir
docker build -t my/serve-image -f docker-debug . # build debug from output dir
docker run my/serve-image # debug-like serving (uses build-image with some watch magic)
于 2016-03-01T21:09:56.840 に答える