#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:
-
Файлы 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
-
Ваш
mongod.conf
может быть смонтирован какConfigMap
— объект Openshift, часто используемый для управления конфигурацией, который может быть смонтирован как том (только для чтения)
Редактировать — Объяснение команды
-
chgrp
противchown
chown
также отлично подходит для использования здесь, но поскольку мы заинтересованы только в обновлении «группы»,chgrp
обеспечивает небольшую дополнительную безопасность, чтобы убедиться, что это единственное, что изменилось (из-за неправильно введенной команды и т.д.) -
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?