Как запустить pgAdmin в OpenShift? - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь запустить контейнер pgAdmin (который я использую здесь ) в кластере OpenShift, где у меня нет прав администратора, а администратор не хочет разрешать контейнеры запускаться от имени пользователя root по соображениям безопасности.

Ошибка, которую я сейчас получаю, выглядит следующим образом:

Я создал Dockerfile, который заранее создает этот каталог на основе изображения, указанного выше, и получаю эту ошибку:

Есть ли способ запустить pgAdmin в OpenShift? Я хочу, чтобы администраторы БД могли регистрироваться в экземпляре pgAdmin и настраивать БД оттуда, без использования OpenShift CLI и переадресации портов. Когда я использую этот метод, соединение с переадресацией портов прерывается очень часто.

Edit1:

Можно ли как-то отредактировать файл Dockerfile и entrypoint.sh, найденный на pgAdmin's github ?

Edit2:

Похоже, что это ошибка в pgAdmin ...: /

https://www.postgresql.org/message-id/15470-c84b4e5cc424169d%40postgresql.org

Ответы [ 4 ]

0 голосов
/ 14 августа 2019

Чтобы обойти эти ошибки, вам нужно добавить записываемый том в контейнер и настроить конфигурацию pgadmin для использования этого каталога.

Permission Denied: '/var/lib/pgadmin'
Permission Denied: '/var/log/pgadmin'

Приведенный ниже пример YAML OpenShift / Kubernetes демонстрирует это, предоставляя пользовательский /pgadmin4/config_local.py, как задокументировано здесь . Это позволяет запускать образ как контейнер с обычными привилегиями.

Обратите внимание, что базовый каталог файлов конфигурации (/var/lib/pgadmin/data) по-прежнему должен находиться под точкой монтирования (/var/lib/pgadmin/), так как код инициализации pgadmin пытается создать / изменить владельца этого каталога, что не разрешено в каталогах точек монтирования внутри контейнер.

apiVersion: v1
kind: List
items:
- apiVersion: v1
  kind: Secret
  metadata:
    labels:
      app: pgadmin-app
    name: pgadmin
  type: Opaque
  stringData:
    username: admin
    password: DEFAULT_PASSWORD
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    annotations:
      serviceaccounts.openshift.io/oauth-redirectreference.pgadmin: '{"kind":"OAuthRedirectReference","apiVersion":"v1","reference":{"kind":"Route","name":"pgadmin"}}'
    labels:
      app: pgadmin-app
    name: pgadmin
- apiVersion: v1
  kind: ConfigMap
  metadata:
    labels:
      app: pgadmin-app
    name: pgadmin
  data:
    config_local.py: |-
      import os
      _BASEDIR = '/var/lib/pgadmin/data'
      LOG_FILE = os.path.join(_BASEDIR, 'logfile')
      SQLITE_PATH = os.path.join(_BASEDIR, 'sqlite.db')
      STORAGE_DIR = os.path.join(_BASEDIR, 'storage')
      SESSION_DB_PATH = os.path.join(_BASEDIR, 'sessions')
    servers.json: |-
      {
        "Servers": {
          "1": {
            "Name": "postgresql",
            "Group": "Servers",
            "Host": "postgresql",
            "Port": 5432,
            "MaintenanceDB": "postgres",
            "Username": "dbuser",
            "SSLMode": "prefer",
            "SSLCompression": 0,
            "Timeout": 0,
            "UseSSHTunnel": 0,
            "TunnelPort": "22",
            "TunnelAuthentication": 0
          }
        }
      }
- apiVersion: apps.openshift.io/v1
  kind: DeploymentConfig
  metadata:
    name: pgadmin
    labels:
      app: pgadmin-app
  spec:
    replicas: 1
    selector:
      app: pgadmin-app
      deploymentconfig: pgadmin
    template:
      metadata:
        labels:
          app: pgadmin-app
          deploymentconfig: pgadmin
        name: pgadmin
      spec:
        serviceAccountName: pgadmin
        containers:
        - env:
          - name: PGADMIN_DEFAULT_EMAIL
            valueFrom:
              secretKeyRef:
                key: username
                name: pgadmin
          - name: PGADMIN_DEFAULT_PASSWORD
            valueFrom:
              secretKeyRef:
                key: password
                name: pgadmin
          - name: PGADMIN_LISTEN_PORT
            value: "5050"
          - name: PGADMIN_LISTEN_ADDRESS
            value: 0.0.0.0
          image: docker.io/dpage/pgadmin4:4
          livenessProbe:
            failureThreshold: 3
            initialDelaySeconds: 30
            httpGet:
              path: /misc/ping
              port: 5050
              scheme: HTTP
            periodSeconds: 60
            successThreshold: 1
            timeoutSeconds: 1
          name: pgadmin
          ports:
            - containerPort: 5050
              protocol: TCP
          readinessProbe:
            failureThreshold: 10
            initialDelaySeconds: 3
            httpGet:
              path: /misc/ping
              port: 5050
              scheme: HTTP
            periodSeconds: 5
            successThreshold: 1
            timeoutSeconds: 1
          volumeMounts:
          - mountPath: /pgadmin4/config_local.py
            name: pgadmin-config
            subPath: config_local.py
          - mountPath: /pgadmin4/servers.json
            name: pgadmin-config
            subPath: servers.json
          - mountPath: /var/lib/pgadmin
            name: pgadmin-data
        - image: docker.io/openshift/oauth-proxy:latest
          name: pgadmin-oauth-proxy
          ports:
          - containerPort: 5051
            protocol: TCP
          args:
          - --http-address=:5051
          - --https-address=
          - --openshift-service-account=pgadmin
          - --upstream=http://localhost:5050
          - --cookie-secret=bdna987REWQ1234
        volumes:
        - name: pgadmin-config
          configMap:
            name: pgadmin
            defaultMode: 0664
        - name: pgadmin-data
          emptyDir: {}
- apiVersion: v1
  kind: Service
  metadata:
    name: pgadmin-oauth-proxy
    labels:
      app: pgadmin-app
  spec:
    ports:
      - name: 80-tcp
        protocol: TCP
        port: 80
        targetPort: 5051
    selector:
      app: pgadmin-app
      deploymentconfig: pgadmin
- apiVersion: route.openshift.io/v1
  kind: Route
  metadata:
    labels:
      app: pgadmin-app
    name: pgadmin
  spec:
    port:
      targetPort: 80-tcp
    tls:
      insecureEdgeTerminationPolicy: Redirect
      termination: edge
    to:
      kind: Service
      name: pgadmin-oauth-proxy
0 голосов
/ 19 января 2019

Я уже ответил на аналогичную проблему для локальной установки. OSError: [Errno 13] В доступе отказано: '/ var / lib / pgadmin'

Для образа докера вы можете отобразить /pgadmin4/config_local.py, используя переменные окружения, отметьте раздел Mapped Files and Directories в https://hub.docker.com/r/dpage/pgadmin4/

0 голосов
/ 19 февраля 2019

Openshift по умолчанию не позволяет запускать контейнеры с привилегией root , вы можете добавить Ограничения контекста безопасности (SCC) пользователю anyuid для проекта, в котором вы находитесь развертывание контейнера.

Добавление SCC для проекта:

$ oc adm policy add-scc-to-user anyuid system:serviceaccount:<your-project>:default

scc "anyuid" added to: ["system:serviceaccount:data-base-administration:default"]
$ oc get scc
NAME               PRIV      CAPS      SELINUX     RUNASUSER          FSGROUP     SUPGROUP    PRIORITY   READONLYROOTFS   VOLUMES
anyuid             false     []        MustRunAs   RunAsAny           RunAsAny    RunAsAny    10         false            [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]

PGAdmin развернуто:

$ oc describe pod pgadmin4-4-fjv4h
Name:               pgadmin4-4-fjv4h
Namespace:          data-base-administration
Priority:           0
PriorityClassName:  <none>
Node:               host/IP
Start Time:         Mon, 18 Feb 2019 23:22:30 -0400
Labels:             app=pgadmin4
                    deployment=pgadmin4-4
                    deploymentconfig=pgadmin4
Annotations:        openshift.io/deployment-config.latest-version=4
                    openshift.io/deployment-config.name=pgadmin4
                    openshift.io/deployment.name=pgadmin4-4
                    openshift.io/generated-by=OpenShiftWebConsole
                    openshift.io/scc=anyuid
Status:             Running
IP:                 IP
Controlled By:      ReplicationController/pgadmin4-4
Containers:
  pgadmin4:
    Container ID:   docker://ID
    Image:          dpage/pgadmin4@sha256:SHA
    Image ID:       docker-pullable://docker.io/dpage/pgadmin4@sha256:SHA
    Ports:          80/TCP, 443/TCP
    Host Ports:     0/TCP, 0/TCP
    State:          Running
      Started:      Mon, 18 Feb 2019 23:22:37 -0400
    Ready:          True
    Restart Count:  0
    Environment:
      PGADMIN_DEFAULT_EMAIL:     secret
      PGADMIN_DEFAULT_PASSWORD:  secret
    Mounts:
      /var/lib/pgadmin from pgadmin4-1 (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-74b75 (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  pgadmin4-1:
    Type:    EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
  default-token-74b75:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-74b75
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  node-role.kubernetes.io/compute=true
Tolerations:     <none>
Events:
  Type    Reason     Age   From                             Message
  ----    ------     ----  ----                             -------
  Normal  Scheduled  51m   default-scheduler                Successfully assigned data-base-administration/pgadmin4-4-fjv4h to host
  Normal  Pulling    51m   kubelet, host  pulling image "dpage/pgadmin4@sha256:SHA"
  Normal  Pulled     51m   kubelet, host  Successfully pulled image "dpage/pgadmin4@sha256:SHA"
  Normal  Created    51m   kubelet, host  Created container
  Normal  Started    51m   kubelet, host  Started container

deploy-image-openshift pgadmin-deployed-ocp

0 голосов
/ 18 января 2019

Это может сработать, если вы создадите пользователя pgadmin через Dockerfile и дадите ему разрешение на запись в /var/log/pgadmin.

Вы можете создать пользователя в Dockerfile с помощью команды RUN; как то так:

# Create pgadmin user
ENV_HOME=/pgadmin
RUN mkdir -p ${HOME} && \
mkdir -p ${HOME}/pgadmin && \
useradd -u 1001 -r -g 0 -G pgadmin -d ${HOME} -s /bin/bash \
-c "Default Application User" pgadmin

# Set user home and permissions with group 0 and writeable.
RUN chmod -R 700 ${HOME} && chown -R 1001:0 ${HOME}

# Create the log folder and set permissions
RUN mkdir /var/log/pgadmin && \
chmod 0600 /var/log/pgadmin && \
chown 1001:0 /var/log/pgadmin

# Run as 1001 (pgadmin)
USER 1001

Настройте вашу установку pgadmin так, чтобы она работала как 1001, и я думаю, что вы должны быть установлены.

...