K8S app source code and runtime separate in pod
In a k8s environment, it is a good choice to have the application runtime and source code build packages separated in separate containers
Smallest source code build image
use a smallest base image to build docker image store source code build result package
Use different images of the runtime environment according to different programming languages
Build app image and runtime image
1# build the app image
2docker build . -t local.dev/py-app:v1
3# build the runtime image
4docker build . -t local.dev/python-3.6:latest
shell
Use kubernetes pod initContainers to share app package to runtime container.
when pod launching the initContainer copy app all package content to shared data volume
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 # Unique key of the Deployment instance
5 name: deployment-py-app
6spec:
7 # 3 Pods should exist at all times.
8 replicas: 3
9 selector:
10 matchLabels:
11 app: py-app
12 template:
13 metadata:
14 labels:
15 # Apply this label to pods and default
16 # the Deployment label selector to this value
17 app: py-app
18 spec:
19 initContainers:
20 - name: py-app-source-code
21 image: local.dev/py-app:v1
22 # init container and app runtime use emtpyvolume shared data
23 command: ["sh", "-c", "cp -r /var/www/app/* /var/shared/data/"]
24 imagePullPolicy: IfNotPresent
25 volumeMounts:
26 - name: app-data
27 mountPath: /var/shared/data
28 containers:
29 - name: app-runtime
30 # Run this image
31 image: local.dev/python-3.6:latest
32 command: ["python3", "/var/app/hello.py"]
33 imagePullPolicy: IfNotPresent
34 ports:
35 - name: http
36 containerPort: 8000
37 protocol: TCP
38 volumeMounts:
39 - name: app-data
40 mountPath: /var/app
41 volumes:
42 - name: app-data
43 emptyDir: {}
shell