web-dev-qa-db-ja.com

Grunt / GulpをDockerコンテナーの内部または外部で実行しますか?

Dockerコンテナー内にデプロイされるgrunt/gulpを使用して、nodejsアプリのビルドプロセスの良い方法を特定しようとしています。

次のシーケンスにかなり満足しています。

  • コンテナー外でgrunt(またはgulp)を使用してビルドする
  • ./distフォルダーをコンテナーに追加する
  • コンテナー内でnpm install(--productionフラグを指定)を実行します

しかし、私が見つけたすべての例で、私は異なるアプローチを見ています。

  • ./srcフォルダーをコンテナーに追加する
  • コンテナー内でnpm install(dev依存関係あり)を実行します
  • コンテナー内でbower install(必要な場合)を実行します
  • コンテナー内で不平を言う

IMO、最初のアプローチは軽量でより効率的なコンテナーを生成しますが、そこにあるすべての例では2番目のアプローチを使用しています。何か不足していますか?

18
scarmuega

私が目にする唯一の違いは、2番目の方法で完全なインストールを再現できることです。

最初の方法では、ローカルアクションに依存しますが、これは、環境によって異なります。

コンテナーは、「必要なもの」を含むホストフォルダーに依存するのではなく、簡単に再現できる画像に基づいている必要があります(その部分がどのように行われたかを知らない)


インストールに伴うビルド環境のオーバーヘッドがひどいイメージには多すぎる場合、次のことができます。

その後、ファイルシステム上にアプリが存在する画像が最終結果になります。

これは、アプローチ1と2の混合です。

3
VonC

静的に生成されたサイト、別のビルドイメージに対して私が行った3番目のアプローチを提案したいと思います。

このアプローチでは、メインのDockerfile(プロジェクトルートにあるもの)がビルドおよび開発イメージになり、基本的に2番目のアプローチですべてを行います。ただし、実行時にCMDをオーバーライドします。これは、ビルドされたdistフォルダーをdist.tarまたは類似のフォルダーに変換することです。

次に、imageがある別のフォルダー(Dockerfileなど)があります。この画像の役割は、dist.tarのコンテンツを提供することだけです。したがって、docker cp <container_id_from_tar_run> /distを実行します。次に、DockerfileはWebサーバーをインストールするだけで、ADD dist.tar /var/wwwがあります。

要約は次のようなものです。

  • builder Dockerイメージをビルドします(これにより、Webサーバーのない作業環境が得られます)。この時点で、アプリケーションが構築されます。 grunt serve、または組み込みの開発サーバーを起動するためのコマンドを使用して、開発中にコンテナーを実行できます。
  • サーバーを実行する代わりに、デフォルトのコマンドをオーバーライドして、distフォルダーをtarにします。 tar -cf /dist.tar /myapp/distのようなもの。
  • これで、/dist.tarアーティファクトを持つ一時コンテナができました。 docker cp <container_id_from_tar_run> /dist.tar ./image/を使用して、imageと呼ばれる実際のデプロイメントDockerフォルダーにコピーします。
  • これで、docker build ./imageを使用して、開発に依存することなく、小さなDockerイメージを構築できます。

まだすべてDockerなので、このアプローチが好きです。このアプローチのすべてのコマンドはDockerコマンドであり、展開する実際のイメージを本当にスリムにすることができます。

このアプローチが実行されているイメージをチェックアウトする場合は、チェックアウトしてください https://github.com/gliderlabs/docker-Alpine これは、ビルダーイメージ(ビルダーフォルダー内)を使用してtarをビルドします。次に、それぞれのDockerfileフォルダーにコピーされる.gzファイル。

4
Andy Shinn

ソリューション1のバリエーションは、プロジェクトのビルドを非常に高速にする「親->子」を持つことです。私は次のようなdockerfileを持っています:

FROM node
RUN mkdir app
COPY dist/package.json app/package.json
WORKDIR app
RUN npm install

これはノードの依存関係のインストールを処理し、次のようなアプリケーションの「インストール」を処理する別のdockerfileを持っています。

FROM image-with-dependencies:v1
ENV NODE_ENV=prod
EXPOSE 9001
COPY dist .
ENTRYPOINT ["npm", "start"]

これにより、開発を続行でき、Dockerイメージの「ビルド」は、ノードの依存関係を「再インストール」する必要がある場合よりも速くなります。ノードに新しい依存関係をインストールする場合は、依存関係イメージを再構築するだけです。

これが誰かの役に立つことを願っています。

よろしく

1
cesaregb