背景
在小型Web应用开发过程中,开发人员并不会区分前端和后端,并且因为是简单的前后端分离,这样讲nginx和node js放在一个Pod下运行,也不用考虑,前后端更新不一致,导致网站异常。
当我们将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个不同的业务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
参数,来指定我们的目标
网友评论