nginxの公式Dockerコンテナイメージ、他のイメージよろしく/docker-entrypoint.d/
になんかしらshell scriptなどを置くと実行する機能があります。
でも現状の実装ではファイル実体でなくsymlinkを置かれたときに無視1されます。今使ってるKubernetes実装k0sはConfigMapをvolume mountするとsymlinkを置くので読んでもらえない。
なので本家にPRを投げたんだけど、それはそれとして現状でどうすればいいかやってみた。
したかったこと
単純にConfigMapを/etc/nginx/conf.d/
にmountするとdefault.conf
がなくなって動かなくなる2ので、/etc/nginx/conf.d/
の中身を保持したまま設定ファイルを追加したい3。
どうしたか
-
/etc/nginx/conf.d/
の中身を保存するemptyDirボリュームを作る -
initコンテナで
/etc/nginx/conf.d/
の中身を組み立てる。- nginxコンテナを起動して
/etc/nginx/conf.d/
をemptyDirボリュームにコピる - Volume mountしたConfigMapの中身をemptyDirボリュームにコピるbusyboxコンテナを起動
- nginxコンテナを起動して
- 前段で作ったemptyDirボリュームを
/etc/nginx/conf.d/
にマウントしてnginxを起動する。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: sample
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.23.3
name: nginx
ports:
- containerPort: 80
name: http
volumeMounts:
- name: contents
mountPath: /usr/share/nginx/html
readOnly: true
- name: confd
mountPath: /etc/nginx/conf.d
initContainers:
- name: copy configmap
image: busybox:1.34.1
command:
- cp
- -r # copy directories recursively
- -L # always follow symbolic links in SOURCE
- -T # treat DEST as a normal file
- /config/
- /confd/
volumeMounts:
- name: config
mountPath: /config
- name: confd
mountPath: /confd
- name: copy nginx conf
image: nginx:1.23.3
command:
- cp
- -r # copy directories recursively
- -L # always follow symbolic links in SOURCE
- -T # treat DEST as a normal file
- /etc/nginx/conf.d/
- /confd/
volumeMounts:
- name: confd
mountPath: /confd
volumes:
- name: confd
emptyDir: {}
- name: contents
persistentVolumeClaim:
claimName: nginx-contents-pvc
- name: config
configMap:
name: nginx-config
注意点
initコンテナでcp
するとき、-T
をつけないと期待しないディレクトリが生成されてはまった4。