我有这个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中运行容器。我已经设法构建并将图像推送到命名空间。并创建了运行容器的下面的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用户是该文件夹的所有者。
是否有必要在部署配置中授予mongodb用户对该文件夹的读/写权限?
1000000001
身份运行,但不能保证将是所选的数字)。这可能意味着mongod
用户不是导致这些问题的选定用户,所以check the documentation指导支持任意用户ID。
对于支持作为任意用户运行的映像,可由映像中的进程写入的目录和文件应由根组拥有,并由该组读/写。要执行的文件还应具有组执行权限。
将以下内容添加到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
mongod.conf
可以作为ConfigMap
安装 - 一个Openshift对象,通常用于管理可以作为(只读)卷安装的配置chgrp
vs chown
chown
也可以在这里使用,但由于我们只对更新“组”感兴趣,chgrp
提供了一些额外的安全性,以确保唯一的改变(由于错误的命令等)chmod -R g=u
chmod
用于更改文件权限;
-R
告诉它通过路径递归(如果有子目录,他们也将获得相同的权限);
g=u
表示“group = user”或“赋予组与用户已存在的权限相同的权限”