【问题标题】:How to optimise the Docker build process in JenkinsPipeline如何在 Jenkins Pipeline 中优化 Docker 构建过程
【发布时间】:2020-05-08 22:28:07
【问题描述】:

我在优化我的 docker 构建步骤时遇到了麻烦。

下面是我的用例:

在我的jenkinsfile 中,我正在构建 3 个 docker 映像。

  1. 来自*docker/test/Dockerfile*
  2. 来自*docker/dev/Dockerfile*
    stage('Build') {
        steps {
            sh 'docker build -t Test -f docker/test/Dockerfile .'
            sh 'set +x && eval $(/usr/local/bin/aws-login/aws-login.sh $AWS_ACCOUNT jenkins eu-west-2) \
              && docker build -t DEV --build-arg S3_FILE_NAME=environment.dev.ts \
              --build-arg CONFIG_S3_BUCKET_URI=s3://bucket \
              --build-arg AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \
              --build-arg AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION \
              --build-arg AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
              --build-arg AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
              -f docker/dev/Dockerfile .'
            sh 'set +x && eval $(/usr/local/bin/aws-login/aws-login.sh $AWS_ACCOUNT jenkins eu-west-2) \
              && docker build -t QA --build-arg S3_FILE_NAME=environment.qa.ts \
              --build-arg CONFIG_S3_BUCKET_URI=s3://bucket \
              --build-arg AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \
              --build-arg AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION \
              --build-arg AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
              --build-arg AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
              -f docker/dev/Dockerfile .'
        }
    }
    stage('Test') {
        steps {
            sh 'docker run --rm TEST npm run test'
        }
    }

下面是我的两个docker文件:

docker/test/Dockerfile

FROM node:lts

RUN mkdir /usr/src/app
WORKDIR /usr/src/app

ENV PATH /usr/src/app/node_modules/.bin:$PATH

RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
RUN apt-key update && apt-get update && apt-get install -y google-chrome-stable

COPY . /usr/src/app

RUN npm install

CMD sh ./docker/test/docker-entrypoint.sh

docker/dev/Dockerfile

FROM node:lts as dev-builder

ARG CONFIG_S3_BUCKET_URI
ARG S3_FILE_NAME
ARG AWS_SESSION_TOKEN
ARG AWS_DEFAULT_REGION
ARG AWS_SECRET_ACCESS_KEY
ARG AWS_ACCESS_KEY_ID

RUN apt-get update
RUN apt-get install python3-dev -y
RUN curl -O https://bootstrap.pypa.io/get-pip.py
RUN python3 get-pip.py

RUN pip3 install awscli --upgrade

RUN mkdir /app
WORKDIR /app
COPY . .

RUN aws s3 cp "$CONFIG_S3_BUCKET_URI/$S3_FILE_NAME" src/environments/environment.dev.ts
RUN cat src/environments/environment.dev.ts

RUN npm install
RUN npm run build-dev

FROM nginx:stable
COPY nginx.conf /etc/nginx/nginx.conf
COPY --from=dev-builder /app/dist/ /usr/share/nginx/html/

每次构建映像需要 20-25 分钟。

有什么方法可以优化 docker 文件以获得更好的构建过程?

欢迎提出建议。 RUN npm run build-dev 使用 package.json 安装依赖项。这是它为每个构建安装所有依赖项的原因之一。

谢谢

【问题讨论】:

    标签: docker jenkins dockerfile


    【解决方案1】:

    您可以结合使用基础映像和多阶段构建来加快构建速度。

    带有预安装包/依赖项的基础映像

    安装 python3、pip、google-chrome、awscli 等不需要每次构建都完成。如果您在单台机器上构建这些层可能会被缓存,但如果您有多个构建机器或清理缓存,您将不必要地重新构建这些层。您可以构建一个已经包含这些内容的基础镜像,并将这个新镜像用作您的应用程序的基础。

    多阶段构建

    您正在复制源代码,然后执行npm install。即使package.json 没有更改,如果源代码中的任何其他文件可能已更改,该层也会重新构建。

    您可以创建一个多阶段 dockerfile,您只需在第一阶段复制 package.json 并运行 npm install 和其他此类命令。仅当 package.json 发生更改时,才会重新构建该层。

    在您的第二阶段,您可以从第一阶段复制 npm 缓存。

    FROM node:lts as dev-builder
    WORKDIR /cache/
    COPY package.json .
    RUN npm install
    RUN npm run build-dev
    
    FROM NEW_BASE_IMAGE_WITH_CHROME_ETC_DEPENDENCIES
    COPY --from=node_cache /cache/ .
    COPY . . 
    <snip>
    

    确定您可以进行的任何其他此类优化。

    【讨论】:

      猜你喜欢
      • 2020-10-18
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      相关资源
      最近更新 更多