首页 > 解决方案 > 如何在 [1002120000, 1002129999] 范围内获取 UID:GID 以使其在 OpenShift 中运行?

问题描述

这适用于 OpenShift Container Platform 4.3

考虑一下Dockerfile

FROM eclipse-mosquitto

# Create folders
USER root

RUN mkdir -p /mosquitto/data /mosquitto/log

# mosquitto configuration
USER mosquitto

# This is crucial to me
COPY --chown=mosquitto:mosquitto ri45.conf /mosquitto/config/mosquitto.conf

EXPOSE 1883

而且,这是我的DeploymentYAML。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mosquitto-broker
spec:
  selector:
    matchLabels:
      app: mosquitto-broker
  template:
    metadata:
      labels:
        app: mosquitto-broker
    spec:
      containers:
        - name: mosquitto-broker
          image: org/repo/eclipse-mosquitto:1.0.1
          imagePullPolicy: Always
          resources:
            limits:
              memory: "128Mi"
              cpu: "500m"
          volumeMounts:
            - name: mosquitto-data
              mountPath: /mosquitto/data
            - name: mosquitto-log
              mountPath: /mosquitto/log
          ports:
            - name: mqtt
              containerPort: 1883
      volumes:
        - name: mosquitto-log
          persistentVolumeClaim:
            claimName: mosquitto-log
        - name: mosquitto-data
          persistentVolumeClaim:
            claimName: mosquitto-data

当我oc create -f使用上述 YAML 进行操作时,我收到此错误,2020-06-02T07:59:59: Error: Unable to open log file /mosquitto/log/mosquitto.log for writing. 也许这是一个权限错误;不能说。无论如何,通过eclipse/mosquitto Dockerfile,我看到这mosquitto是一个具有 UID 和 GID 的用户1883。所以,我按照这里securityContext的描述添加了。

securityContext:
  fsGroup: 1883

当我进行oc create -f此修改时,我收到此错误 - securityContext.securityContext.runAsUser: Invalid value: 1883: must be in the ranges: [1002120000, 1002129999]

这种添加initContainer设置权限的方法对我不起作用,因为我必须root这样做。

那么,如何使 Eclipse mosquitto 容器能够/mosquitto/log成功写入呢?

标签: dockerfilesystemsopenshiftaclmosquitto

解决方案


这里有很多事情要解决。

首先,您应该确保您确实想要将配置文件烘焙到您的容器映像中。通常,配置文件是通过ConfigMaps或添加Secrets的,因为云原生应用程序中的配置通常应该来自环境(在您的情况下为 OpenShift)。

其次,您似乎正在登录PersistentVolume. 这也是一种糟糕的做法,因为最佳做法是登录stdout. 当然,将应用程序数据(事务日志)保存在持久卷上是有意义的。

至于您的原始问题(考虑到上述两点,应该不再相关),可以使用SecurityContextContraints(SCC)来解决该问题:管理安全上下文约束

因此,要解决您的问题,您应该使用/创建runAsUser正确设置的 SCC。


推荐阅读