【发布时间】:2020-11-22 01:10:55
【问题描述】:
我有一个使用 docker swarm 部署的 nginx Web 服务器,我希望也能够使用 kubernetes 部署它。
现在我无法将 nginx 配置文件插入到容器中。
我将首先在这里发布我在 docker swarm 中已经做过的事情,然后是我在 kubernetes 中尝试过的事情。
Dockerfile:
FROM "nginx:1.19.1-alpine" AS nginx
[...]
RUN \
rm -fv /etc/nginx/nginx.conf && \
ln -svT /usr/local/etc/nginx/nginx.conf \
/etc/nginx/nginx.conf && \
rm -frv /etc/nginx/conf.d && \
ln -svT /usr/local/etc/nginx/conf.d \
/etc/nginx/conf.d
[...]
基本上我设置了映像,以便我可以将自定义 nginx 配置文件放入 /usr/local/etc/ 而不是 /etc/
Docker 群:
docker-compose.yaml:
configs:
nginx_conf:
file: /run/configs/www/etc/nginx/nginx.conf
nginx_conf_security-parameters:
file: /run/configs/www/etc/nginx/conf.d/security-parameters.conf
nginx_conf_server:
file: /run/configs/www/etc/nginx/conf.d/server.conf
networks:
alejandro-colomar:
services:
www:
configs:
-
mode: 0440
source: nginx_conf
target: /usr/local/etc/nginx/nginx.conf
-
mode: 0440
source: nginx_conf_security-parameters
target: /usr/local/etc/nginx/conf.d/security-parameters.conf
-
mode: 0440
source: nginx_conf_server
target: /usr/local/etc/nginx/conf.d/server.conf
deploy:
placement:
constraints:
- node.role == worker
replicas: 1
restart_policy:
condition: any
image: "alejandrocolomar/www:0.16-a6-kube"
networks:
-
"alejandro-colomar"
ports:
- "32001:8080"
version: "3.8"
在这里,我使用 nginx 自定义配置文件,我首先将它们放入 /run/configs/ 和脚本中,以便它们在 ram 中,并将它们作为配置引入容器中的正确位置(/usr/local/etc/nginx/ 及其子目录 @ 987654329@)。
我想在 kubernetes 中做同样的事情,我读到我应该为此使用预计的卷(如果它适用于普通卷或以其他方式,而不必使用任何肮脏的解决方法,我也对此持开放态度),所以我尝试了以下方法(在看到一些我不太清楚的例子之后):
config.sh:
kubectl create configmap "nginx-conf-cm" \
--from-file "/run/configs/www/etc/nginx/nginx.conf"
kubectl create configmap "nginx-conf-security-parameters-cm" \
--from-file "/run/configs/www/etc/nginx/conf.d/security-parameters.conf"
kubectl create configmap "nginx-conf-server-cm" \
--from-file "/run/configs/www/etc/nginx/conf.d/server.conf"
deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: www-deploy
spec:
replicas: 1
selector:
matchLabels:
service: www-svc
template:
metadata:
labels:
service: www-svc
spec:
containers:
-
image: "alejandrocolomar/www:0.16-a6-kube"
name: www-container
volumeMounts:
-
mountPath: /usr/local/etc/nginx/
name: nginx-volume
readOnly: true
volumes:
-
name: nginx-volume
projected:
sources:
-
configMap:
name: nginx-conf-cm
path: "nginx.conf"
-
configMap:
name: nginx-conf-security-parameters-cm
path: "conf.d/security-parameters.conf"
-
configMap:
name: nginx-conf-server-cm
path: "conf.d/server.conf"
service.yaml:(这个我放在这里只是为了完整)
apiVersion: v1
kind: Service
metadata:
name: www
spec:
ports:
-
nodePort: 32001
port: 8080
selector:
service: www-svc
type: NodePort
部署当然失败了,但我认为这并没有错。当我进入容器调试时,问题是这三个文件都放到/usr/local/etc/nginx/中,而子目录conf.d/没有创建:
/usr/local/etc/nginx/nginx.conf
/usr/local/etc/nginx/security-parameters.conf
/usr/local/etc/nginx/server.conf
我应该如何解决这个问题(大概在deployment.yaml),以便我在容器中有以下文件?:
/usr/local/etc/nginx/nginx.conf
/usr/local/etc/nginx/conf.d/security-parameters.conf
/usr/local/etc/nginx/conf.d/server.conf
【问题讨论】:
标签: docker kubernetes subdirectory docker-volume