Как запустить pgAdmin в OpenShift?

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

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

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

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

Редактировать1:

Есть ли способ отредактировать файлы Dockerfile и entrypoint.sh, найденные на GitHub pgAdmin< /а>?

Изменить2:

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

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


person The Dude    schedule 17.01.2019    source источник


Ответы (4)


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

person Fulvio    schedule 19.02.2019

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

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

Приведенный ниже пример OpenShift/Kubernetes YAML демонстрирует это, предоставляя пользовательский /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
person jwmullally    schedule 14.08.2019
comment
Я вижу Murtuza Z уже ответил здесь, но я оставлю этот пример здесь для всех, кто хочет знать, как это сделано. - person jwmullally; 14.08.2019

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

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

person Murtuza Z    schedule 19.01.2019
comment
Он просит решение для OpenShift, а не для докера - person Jan Dev; 29.01.2021

Это может сработать, если вы создадите пользователя 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, и я думаю, вы должны быть настроены.

person Ciaodown    schedule 18.01.2019
comment
Я все еще получаю эту ошибку, когда мой Dockerfile создается FROM: dpage/pgadmin4 - person The Dude; 23.01.2019
comment
Хорошо, теперь я больше не получаю эту ошибку, потому что я сделал chmod 0777 /var/log/pgadmin, и я получаю только ошибки Starting gunicorn 19.8.1 и Can't connect to ('::', 80) - person The Dude; 23.01.2019
comment
Я не уверен, поможет ли это, так как это может быть ошибка, но вы можете попробовать включить PGADMIN_ENABLE_TLS, чтобы посмотреть, сможете ли вы заставить его работать поверх 443. Кроме того, я заметил, что учетная запись Github сопоставляет 80:8080 и 443: 8443 в команде docker run, но документация (pgadmin.org/ docs/pgadmin4/dev/) сопоставляет 80:80 и 443:443, что странно, так как вы получаете сообщение об ошибке при подключении к порту 80, но команда запуска пытается сопоставить ваш хост 80 с 8080 контейнера . - person Ciaodown; 23.01.2019
comment
Как оказалось, это ошибка, и pgAdmin может запускать только как root. Я показал это администратору кластера, и он сказал, что создаст учетную запись службы, которая может запускать приложения как anyuid. К сожалению, похоже, это исправление. Должен ли я ответить на свой вопрос? Я новичок в переполнении стека. - person The Dude; 24.01.2019
comment
Я не уверен, что правильно, но я бы, наверное, просто ответил на ваш вопрос, раз уж вы это сделали. - person Ciaodown; 24.01.2019