sidecar-example-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
initContainers:
- image: registry-vpc.cn-qingdao.aliyuncs.com/houcaoyu/sidecar-dist-example:v1.0
name: src
command: ["cp","-r","/usr/local/src/.","/app"]
volumeMounts:
- mountPath: "/app"
name: nginx-vol
containers:
- name: nginx
image: nginx:1.8
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nginx-vol
volumes:
- name: nginx-vol
emptyDir: {}
与之前的yaml文件的区别仅在于initContainers这一段。
其中都了一个sidecar-dist-example:v1.0镜像,这个镜像是我自己做的(我把他放到了阿里云的镜像仓库上,这个地址是阿里云内网的,你在用的时候需要换成自己的仓库地址),其实很简单,只是在它内部的/usr/local/src目录下放了一个index.html文件。
initContainers这一段的作用就是把这个镜像的/usr/local/src目录里的所有内容拷贝到/app目录下,然后就退出了。
而/app目录是通过volumes定义的一个空目录,这个目录在后边nginx镜像上被挂载到了/usr/share/nginx/html,这样就把代码动态加入到了nginx中。
利用initContainer发布代码的好处是,不用每次代码变更时都对nginx重新build,在镜像间实现了解耦。