背景
在小型Web應用開發(fā)過程中,開發(fā)人員并不會區(qū)分前端和后端二鳄,并且因為是簡單的前后端分離好港,這樣講nginx和node js放在一個Pod下運行,也不用考慮症脂,前后端更新不一致谚赎,導致網(wǎng)站異常。
當我們將runner丟在K8s中去運行時诱篷,如果還采用docker命令壶唤,不斷要去處理sock的映射,還要考慮CNI非docker的場景下的問題棕所,這個時候闸盔,直接使用Google的kaniko
是一個很好的選擇。
Dockerfile
因為前后端都需要node編譯琳省,所以這里采用multi-stage
########################################################
############### INITIALIZE IMAGE ###################
########################################################
FROM node:16.18-buster-slim AS init
WORKDIR /app
RUN apt-get update && \
apt-get install --no-install-recommends -y python3 make g++
RUN mkdir -p /app/backend && \
mkdir -p /app/frontend
ADD src/ .
ADD nginx nginx
RUN cd /app/backend && \
yarn && \
yarn build && \
yarn cache clean --all && \
yarn install --production && \
rm -rf src test && \
cd /app/frontend && \
yarn && \
yarn build && \
rm -rf src node_modules
########################################################
############### NGINX IMAGE ###################
########################################################
FROM nginx:1.16.1-alpine AS nginx
ENV TZ="Asia/Ho_Chi_Minh"
RUN mkdir -p /etc/nginx/whitelisted_ip
COPY --from=init /app/nginx/whitelist/* /etc/nginx/whitelisted_ip/
COPY --from=init /app/nginx/conf/* /etc/nginx/conf.d/
COPY --from=init /app/frontend/dist /var/www/frontend/dist
########################################################
############### BACKEND IMAGE ###################
########################################################
FROM node:16.18-buster-slim AS backend
RUN mkdir -p /log
COPY --from=init /app/backend /var/www/backend
WORKDIR /var/www/backend
使用一個基礎的Image迎吵,Build出2個不同的業(yè)務Image
CI
before_script:
- export EVENT_NAME="$(echo $CI_PROJECT_NAME | awk -F"." '{print tolower($1)}' )"
- export IMAGE="test/${EVENT_NAME}"
- export IMAGE_TAG=${CI_COMMIT_SHA:0:8}
stages:
- push
push:image:
image:
entrypoint:
- ''
name: gcr.io/kaniko-project/executor:debug
rules:
- if: $CI_PIPELINE_SOURCE == "api"
script:
- /kaniko/executor
--context ${CI_PROJECT_DIR}
--dockerfile "${CI_PROJECT_DIR}/Dockerfile"
--destination ${IMAGE}-backend:${IMAGE_TAG}
--target backend
- /kaniko/executor
--context ${CI_PROJECT_DIR}
--dockerfile "${CI_PROJECT_DIR}/Dockerfile"
--destination ${IMAGE}-nginx:${IMAGE_TAG}
--target nginx
stage: push
tags:
- k8s-runner
使用
--target
參數(shù)躲撰,來指定我們的目標