J'essaie d'exécuter Chart Museum en tant qu'utilisateur non root dans OpenShift. Voici un aperçu de mon YAML.
FROM alpine:3.10.3 RUN apk add --no-cache cifs-utils ca-certificates \ && adduser -D -u 1000 chartmuseum COPY bin/linux/amd64/chartmuseum /chartmuseum USER 1000 ENTRYPOINT ["/chartmuseum"]
Comme vous pouvez le voir, j'ai défini spec.containers.securityContext.fsGroup
sur 1000
qui est identique à l'ID utilisateur dans le Dockerfile
Chart Museum comme indiqué ci-dessous.
apiVersion: apps/v1 kind: Deployment metadata: name: chart-museum namespace: demo spec: selector: matchLabels: app: chart-museum replicas: 1 template: metadata: labels: app: chart-museum spec: volumes: - name: pvc-charts persistentVolumeClaim: claimName: pvc-charts containers: - name: chart-museum securityContext: fsGroup: 1000 image: chartmuseum/chartmuseum:latest ports: - containerPort: 8080 envFrom: - configMapRef: name: chart-museum volumeMounts: - name: pvc-charts mountPath: "/charts"
Et, pourtant, quand j'essaye de télécharger un graphique , je reçois un message d'autorisation refusée pour / charts code>. Comment contourner ce problème?
3 Réponses :
Il est lié à Kubernetes et à la façon dont le volume persistant donné est défini. Vous pouvez consulter toutes les discussions et les solutions de contournement possibles dans le problème GH associé . P >
Laissez-moi essayer l'option d'ajouter un chown
( github .com / kubernetes / kubernetes / issues /… ) Comme mentionné dans ma question, l'option fsGroup
( github.com/kubernetes/kubernetes/issues/... ) n'a pas fonctionné pour moi en fait.
Ajoutez les lignes chmod / chown
dans votre fichier docker:
containers: - name: chart-museum securityContext: runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000
Modifiez votre spec.template.spec.containers.securityContext en assurez-vous que l'utilisateur et le groupe seront appliqués.
FROM alpine:3.10.3 RUN apk add --no-cache cifs-utils ca-certificates \ && adduser -D -u 1000 chartmuseum COPY bin/linux/amd64/chartmuseum /chartmuseum RUN chmod +xr /chartmuseum RUN chown 1000:1000 /chartmuseum USER 1000 ENTRYPOINT ["/chartmuseum"]
Le YAML pour le déploiement était considéré comme valide uniquement lorsque fsGroup
était supprimé. Ensuite, le déploiement a échoué avec cette raison impossible de valider par rapport à une contrainte de contexte de sécurité: [spec.containers [0] .securityContext.securityContext.runAsUse r: Valeur non valide: 1000: doit être dans les plages: [1000350000, 1000359999]]
Le problème vient de / charts
. Comment votre Dockerfile
résout-il ce problème? Et avec spec.template.spec.containers
, fsGroup
a été appelé comme invalide. Les valeurs numériques de runAsUser
et runAsGroup
ont été jugées trop faibles et le conteneur n'a jamais démarré.
Voici comment j'ai résolu le problème.
curl -LO https://s3.amazonaws.com/chartmuseum/release/latest/bin/linux/amd64/chartmuseum
. chmod + xr chartmuseum
Dockerfile
comme indiqué ci-dessous. En gros, utilisez le nom d'utilisateur au lieu de l'ID pour les commandes chown
afin que le binaire et l'emplacement de stockage appartiennent à l'utilisateur chartmuseum
et non à root
. docker run --rm -it \ -p 8080:8080 \ -v $(pwd)/charts:/charts \ -e DEBUG=true \ -e STORAGE=local \ -e STORAGE_LOCAL_ROOTDIR=/charts \ chartmuseum/chartmuseum:latest
somerepo / chartmuseum: 0.0.0
. PersistentVolumeClaim
n'est pas traitée ici. kind: ConfigMap apiVersion: v1 metadata: name: chart-museum namespace: demo data: DEBUG: 'true' STORAGE: local STORAGE_LOCAL_ROOTDIR: "/charts" --- apiVersion: apps/v1 kind: Deployment metadata: name: chart-museum namespace: demo spec: selector: matchLabels: app: chart-museum replicas: 1 template: metadata: labels: app: chart-museum spec: volumes: - name: pvc-charts persistentVolumeClaim: claimName: pvc-charts containers: - name: chart-museum image: somerepo/chartmuseum:0.0.0 imagePullPolicy: Always ports: - containerPort: 8080 envFrom: - configMapRef: name: chart-museum volumeMounts: - mountPath: "/charts" name: pvc-charts resources: limits: memory: "128Mi" cpu: "500m" imagePullSecrets: - name: us.icr.io.secret --- apiVersion: v1 kind: Service metadata: labels: app: chart-museum name: chart-museum namespace: demo spec: type: ClusterIP ports: - name: 8080-tcp port: 8080 protocol: TCP targetPort: 8080 selector: app: chart-museum --- apiVersion: route.openshift.io/v1 kind: Route metadata: labels: app: chart-museum name: chart-museum namespace: demo spec: port: targetPort: 8080-tcp tls: insecureEdgeTerminationPolicy: Redirect termination: edge to: kind: Service name: chart-museum
Le manifeste crée un objet ConfigMap
et utilise un PersistentVolumeClaim
pour «répliquer» la commande pour exécuter Chart Museum localement (comme décrit sur https://chartmuseum.com/ )
FROM alpine:3.10.3 RUN apk add --no-cache cifs-utils ca-certificates \ && adduser -D -u 1000 chartmuseum COPY chartmuseum /chartmuseum RUN chown chartmuseum:chartmuseum /chartmuseum RUN chown chartmuseum:chartmuseum /charts USER chartmuseum ENTRYPOINT ["/chartmuseum"]
Le Service
et la Route
du manifeste exposent le dépôt au monde externe.
HOST / PORT
dans oc get route / chart-museum -n demo
avec https
dans barre d'adresse et appuyez sur Entrée. Vous devriez voir une page d'accueil pour Chart Museum. Cela signifie que l'installation est réussie.