Как оптимизировать процесс сборки Docker в JenkinsPipeline - PullRequest
2 голосов
/ 22 января 2020

У меня проблемы с оптимизацией шага сборки 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 для установки зависимостей. Это одна из причин, по которой он устанавливает все зависимости для каждой сборки.

Спасибо

1 Ответ

1 голос
/ 22 января 2020

Вы можете использовать комбинацию базовых образов и многоступенчатых сборок для ускорения ваших сборок.

Базовый образ с предустановленными пакетами / зависимостями

Вещи, подобные установке python3, pip, google-chrome, awscli et c не нужно выполнять каждую сборку. Эти слои могут кэшироваться, если вы собираете на одной машине, но если у вас несколько сборочных машин или вы очищаете кеш, вы будете без необходимости перестраивать эти слои. Вы можете создать базовый образ, в котором уже есть этот материал, и использовать этот новый образ в качестве основы для своего приложения.

Многоступенчатые сборки

Вы копируете свой исходный код, а затем выполняете npm install. Даже если package.json не изменился, слой будет перестроен, если любой другой файл в исходном коде мог измениться.

Вы можете создать многоэтапный файл Docker, в который вы просто копируете пакет. json на первом этапе и запустить npm install и другие подобные команды. Этот слой будет перестроен только в случае изменения пакета. 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>

Определите любые другие подобные оптимизации, которые вы можете сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...