Dockerコンテナー内にデプロイされるgrunt/gulpを使用して、nodejsアプリのビルドプロセスの良い方法を特定しようとしています。
次のシーケンスにかなり満足しています。
しかし、私が見つけたすべての例で、私は異なるアプローチを見ています。
IMO、最初のアプローチは軽量でより効率的なコンテナーを生成しますが、そこにあるすべての例では2番目のアプローチを使用しています。何か不足していますか?
私が目にする唯一の違いは、2番目の方法で完全なインストールを再現できることです。
最初の方法では、ローカルアクションに依存しますが、これは、環境によって異なります。
コンテナーは、「必要なもの」を含むホストフォルダーに依存するのではなく、簡単に再現できる画像に基づいている必要があります(その部分がどのように行われたかを知らない)
インストールに伴うビルド環境のオーバーヘッドがひどいイメージには多すぎる場合、次のことができます。
app.tar
"インストール専用( Apacheの場合は、再コンパイルしなければなりませんでしたdebパッケージを共有ボリュームに作成 )。最初のコンテナーのボリュームを使用して、ベースイメージからコンテナーを作成する
docker run --it --name=app.inst --volumes-from=app.tar ubuntu untar /shared/path/app.tar
docker commit app.inst app
その後、ファイルシステム上にアプリが存在する画像が最終結果になります。
これは、アプローチ1と2の混合です。
静的に生成されたサイト、別のビルドイメージに対して私が行った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
、または組み込みの開発サーバーを起動するためのコマンドを使用して、開発中にコンテナーを実行できます。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ファイル。
ソリューション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イメージの「ビルド」は、ノードの依存関係を「再インストール」する必要がある場合よりも速くなります。ノードに新しい依存関係をインストールする場合は、依存関係イメージを再構築するだけです。
これが誰かの役に立つことを願っています。
よろしく