Преобразование сценария dockerfile + bash в конфигурацию развертывания OpenShift - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть этот dockerfile:

FROM centos:latest
COPY mongodb.repo /etc/yum.repos.d/mongodb.repo

RUN yum update -y && \
    yum install -y mongodb-org mongodb-org-shell iproute nano

RUN mkdir -p /data/db && chown -R mongod:mongod /data

, который я могу прекрасно собрать и запустить локально с помощью docker с помощью:

docker build -t my-image .
docker run -t -d -p 27017:27017 --name my-container my-image
docker cp mongod.conf my-container:/etc/mongod.conf
docker exec -u mongod my-container "mongod --config /etc/mongod.conf"

Теперь я хотел бы запустить контейнер в OpenShift.Мне удалось построить и поместить изображение в пространство имен.И создал ниже deployConfig , который запускает контейнер - точно так же, как я могу сделать локально.

- apiVersion: v1
  kind: DeploymentConfig
  metadata:
    name: my-app
    namespace: my-namespace
  spec:
    replicas: 1
    selector:
      app: my-app
    template:
      metadata:
        labels:
          app: my-app
          deploymentconfig: my-app
      spec:
        containers:
        - name: my-app
          image: ${IMAGE}
          command: ["mongod"]
          ports:
           - containerPort: 27017 
          imagePullPolicy: Always

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

exception in initAndListen: IllegalOperation: Attempted to create a lock file on a read-only directory: /data/db, terminating

Почему в папке /data/db отсутствует чтение / запись?Как видно из приведенного выше Dockerfile , эта папка создана, и пользователь mongod является владельцем этой папки.

Необходимо ли предоставить mongod пользователь как-то читает / записывает в эту папку в deployConfig?

1 Ответ

3 голосов
/ 22 апреля 2019
  1. Файлы Docker будут работать от имени неизвестного пользователя arbirtrary, не являющегося пользователем root (просто представьте, что mongodb работает от имени пользователя 1000000001, но нет гарантии, что это будет выбранное число).Это может означать, что пользователь mongod не выбранный пользователь, вызывающий эти проблемы, поэтому см. Документацию для получения инструкций по поддержке произвольных идентификаторов пользователей.

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

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

    RUN chgrp -R 0 /some/directory && \   <- Set the group to 0 (the root group)
    chmod -R g=u /some/directory          <- Here you will set your permissions
    
  2. Ваш mongod.conf может быть смонтирован как ConfigMap - объект Openshift, часто используемый для управления конфигурацией, который может быть смонтирован как том (только для чтения)

Редактировать - Объяснение команды

  1. chgrp против chown

    chown также прекрасно подходит для использованияздесь, но поскольку мы заинтересованы только в обновлении «группы», chgrp обеспечивает немного дополнительную безопасность, чтобы убедиться, что это единственное, что изменяется (из-за неверно набранной команды и т. д.)

  2. chmod -R g=u

    • chmod используется для изменения прав доступа к файлу;
    • -R говорит ему, чтобы он проходил по пути (в случае наличия подкаталогов они будуттакже получить те же разрешения);
    • g=u означает«группа = пользователь» или «дать группе те же разрешения, что и те, которые уже есть для пользователя»
...