K8S中挂载目录引发的血案

2020-06-05 00:00:00 专区 文件 都是 目录 其他的

在kubernetes中部署前端项目(使用nginx作为服务器)的时候,遇到了一个报错,报错信息如下

2019/11/19 02:16:31 [emerg] 1#1open() "/etc/nginx/mime.*" failed (2: No such file or directory) in /etc/nginx/nginx.conf:14
nginx: [emerg] open() "/etc/nginx/mime.*" failed (2: No such file or directory) in /etc/nginx/nginx.conf:14

提示的意思是没有找到mine.*文件,也就是说容器内/etc/nginx下不存在这个文件。但是这个文件不是nginx提供的吗?

我赶忙看了下我是如何部署这个容器的。

dockerfile:

FROM nginx:1.17.3
COPY dist /usr/share/nginx/html

deployment.yml:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: smcp-web
  namespace: nginx-test
spec:
  selector:
    matchLabels:
      app: smcp-web
  replicas: 1
  template:
    metadata:
      labels:
        app: smcp-web
    spec:
      containers:
      - name: smcp-web
        image: docker-registry.xxx.com/fe/fe-nginx:no-nginx-conf
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-conf
          mountPath: /etc/nginx
      volumes:
      - name: nginx-conf
        configMap:
          name: nginx-conf
          items:
            - key: nginx.conf
              path: nginx.conf

这样就会将在configMap中声明的nginx.conf对应内容挂载到/etc/nginx(mountPath)/nginx.conf文件中。

kubectl create configmap nginx-conf --from-file=nginx.conf=./path/to/nginx.conf -n nginx-test

一想到这里我大概知道了原因,是因为我们挂载的是整个/etc/nginx目录,但是我们这个目录里面只加了nginx.conf,而容器中/etc/nginx目录下面还有很多其他的文件, 我们直接挂载了整个目录进去,其他的文件会随着目录的挂载而消失,自然读取配置就出了问题。

现在问题已经知道了,如何解决呢?

要是可以只挂载这个文件就好了,查阅了下文档,发现subPath完全可以满足我们的需求。

subPath的目的是为了在单一Pod中多次使用同一个volume而设计的

所以将spec部分修改如下:

spec:
  containers:
  - name: smcp-web
    image: docker-registry.xxx.com/fe/fe-nginx:no-nginx-conf
    ports:
    - containerPort: 80
    volumeMounts:
    - name: nginx-conf
      mountPath: /etc/nginx/nginx.conf
      subPath: nginx.conf
  volumes:
  - name: nginx-conf
    configMap:
      name: nginx-conf

这样我们就做到了将nginx.conf文件挂载到/etc/nginx目录下,同时不影响原有目录中的内容。


相关文章