Преобразование dockerfile bash-скрипта в конфигурацию развертывания OpenShift

#docker #openshift

#docker #openshift

Вопрос:

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

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

RUN yum update -y amp;amp; 
    yum install -y mongodb-org mongodb-org-shell iproute nano

RUN mkdir -p /data/db amp;amp; 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. Мне удалось создать и поместить изображение в пространство имен. И создали приведенный ниже DeploymentConfig, который запускает контейнер — точно так же, как я могу сделать локально.

 - 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 чтение / запись в эту папку в DeploymentConfig?

Ответ №1:

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

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

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

     RUN chgrp -R 0 /some/directory amp;amp;    <- 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 означает «группа = пользователь» или «предоставить группе те же разрешения, что и те, которые уже есть у пользователя»

Комментарии:

1. На самом деле ошибка связана не с файлом mongo.conf, а с папкой / data / db, в которую mongodb записывает файлы при запуске. Итак, как мне заставить эту папку читать / записывать — поскольку этого недостаточно в Dockerfile?

2. @u123 Вы правы, я просто показывал, как DeploymentConfig можно написать в соответствии с вашими требованиями Dockerfile . Пожалуйста, прочтите документацию, связанную выше, по произвольным UID, в которой объясняется, как установить разрешения в Dockerfile .

3. Кажется, это решает мою проблему, спасибо! Два вопроса: 1) Что на самом деле делает chmod -R g = u? Я знаю chmod, но не смог найти, что ‘g = u’ делает в: linux.die.net/man/1/chmod . 2) Зачем использовать chgrp вместо chown?