1

私のコード (nodeJS-application) は (npm) の依存関係よりも頻繁に変更されるため、CI にキャッシュのようなものを構築しようとしました。

マルチステージ Dockerfile を使用しています。その中で、すべての prod 依存関係に対してのみ npm install を実行します。後でそれらは最終イメージにコピーされるため、はるかに小さくなります。偉大な。

また、依存関係が変更されていない場合、ビルドは非常に高速になります。

ただし、時間の経過とともに hd がいっぱいになるdocker prune ...ため、スペースを取り戻すために実行する必要があります。しかし、これを行うと、キャッシュがなくなります。

そのため、CI で各パイプラインの後に実行するpruneと、マルチステージ Dockerfile の「キャッシュ機能」が得られません。

### 1. Build
FROM node:10.13 AS build
WORKDIR /home/node/app

COPY ./package*.json ./
COPY ./.babelrc ./

RUN npm set progress=false \
    && npm config set depth 0 \
    && npm install --only=production --silent \
    && cp -R node_modules prod_node_modules
RUN npm install --silent

COPY ./src ./src
RUN ./node_modules/.bin/babel ./src/ -d ./dist/ --copy-files

### 2. Run
FROM node:10.13-alpine
RUN apk --no-cache add --virtual \
      builds-deps \
      build-base \
      python
WORKDIR /home/node/app

COPY --from=build /home/node/app/prod_node_modules ./node_modules
COPY --from=build /home/node/app/dist .

EXPOSE 3000
ENV NODE_ENV production
CMD ["node", "app.js"]
4

1 に答える 1

1

CI システムで複数のdocker buildステップを使用できる場合、これを 2 つの Dockerfile に分割できます。

# Dockerfile.dependencies
# docker build -f Dockerfile.dependencies -t me/dependencies .
FROM node:10.13
...
RUN npm install
# Dockerfile
# docker build -t me/application .
FROM me/dependencies:latest AS build
COPY ./src ./src
RUN ./node_modules/.bin/babel ./src/ -d ./dist/ --copy-files

FROM node:10.13-alpine
...
CMD ["node", "app.js"]

これを行うと、各ビルド後に未使用のイメージを削除できます。

docker image prune

依存関係イメージの最新のビルドにはラベルが付けられるため、「ぶら下がっている」ことはなく、イメージ リストには表示されません。各ビルドで、そのラベルは以前のビルド (変更されている場合) から「取得」されるため、このシーケンスは以前のビルドをクリーンアップします。これにより、「ビルド」イメージも削除されますが、ビルドをトリガーするために何かが変更された場合、それはおそらくsrcツリーにあるため、再構築を強制することは合理的です。

この特定の状況では、latestタグを使用するだけで適切です。最終的にビルドされたイメージに (バージョン番号やタイムスタンプなどに基づいて) より一意のタグがあり、それらが積み重なっている場合は、イメージ リストをよりクリエイティブにフィルタリングしてクリーンアップする必要がある場合があります。

于 2018-11-11T11:42:30.487 に答える