Thứ Sáu, 12 tháng 4, 2019

Multi-Stage Build là 1 tính năng rất hay của Docker. Trước đây, để setup 1 docker có kích thước nhỏ rất phức tạp, phải dùng nhiều mẹo viết bash mới được. Nay dùng Multi-Stage siêu dễ.
Example: Cần build 1 docker web Django có sử dụng nodejs có sử dụng webpack thì các bước thông thường sẽ là:
  1. Cài các thư viện liên quan tới python
  2. Cài NodeJS
  3. Cài các thư viện nodejs liên quan tới project
Để thực hiện 3 bước này bạn cần phải cài: Các thư viện python, rồi là nodejs, webpack … Nhưng vấn đề là nhiều các rất dư thừa và chỉ cần nó trong quá trình build mà thôi, không cần nó trong Docker Image cuối cùng. Chính sự dư thừa này khiến Docker Images cuối cùng sẽ có kích thước rất lớn.
Multi-Stage Build ra đời giúp ta giải quyết vấn đề này, giúp Docker image cuối cùng chỉ còn những gì cần thiết nhất:
### Build and install packages
FROM python:3.7.2 as build-python

RUN apt-get -y update \
  && apt-get install -y gettext \
  # Cleanup apt cache
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

# Install Python dependencies
RUN pip install pipenv
COPY Pipfile Pipfile.lock /app/
WORKDIR /app
RUN pipenv install --system --deploy --dev

### Build static assets
FROM node:10 as build-nodejs

# Install node_modules
COPY webpack.config.js app.json package.json package-lock.json tsconfig.json tslint.json webpack.d.ts /app/
WORKDIR /app
RUN npm install

RUN npm run build-assets --production \
  && npm run build-emails --production

FROM python:3.7.2-alpine3.8

ARG HOST_USER_UID=1000
ARG HOST_USER_GID=1000
ARG HOST_USER_NAME=www
ARG HOST_GROUP_NAME=www

RUN mkdir -p /app

RUN set -xe \
&& apk add --no-cache git ssmtp \
&& echo 'Creating notroot user and group from host' \
&& addgroup -g ${HOST_USER_GID} -S ${HOST_GROUP_NAME} \
&& adduser  -u ${HOST_USER_UID} -D -S -G ${HOST_GROUP_NAME} ${HOST_USER_NAME} \
&& pip install --upgrade pip \

USER ${HOST_USER_NAME}

USER root
RUN set -xe \
&& ln -s /home/www/.local/bin/* /usr/local/bin/

COPY ./code/requirements.txt /app

RUN cd /app \
&& pip install --no-cache-dir -r requirements.txt


WORKDIR /app
Dockerfile được phân thành 3 giai đoạn rất rõ ràng và dễ hiểu
  • Install python
  • Build static file
  • Đóng gói
Source: Use multi-stage builds

Reactions: