我正在使用下面的Dockerfile
和entrypoint.sh
。我需要以非root用户身份启动容器中的crond
服务,但得到Permission denied
。如何以非root用户身份启动crond
服务?
我需要在USER
中加入Dockerfile
,因为这是我的Openshift 3平台中的强制管理设置。
Dockerfile
FROM centos:centos7.4.1708
RUN yum update -y && yum install -y cronie && rm -rf /var/lib/apt/lists/*
RUN cd / && mkdir /code
ADD entrypoint.sh /code/
RUN chmod -R 755 /code/entrypoint.sh
ENTRYPOINT ["/code/entrypoint.sh"]
RUN useradd -l -u 1001510000 -c "1001510000" 1001510000
USER 1001510000
CMD ["top"]
entrypoint.sh
#!/bin/bash
echo "in the entrypoint!"
echo "executing id"
id
echo "executing crond start"
crond start
echo "executing $@"
$@
错误输出
in the entrypoint!
executing id
uid=1001510000(1001510000) gid=1000(1001510000) groups=1000(1001510000)
executing crond start
crond: can't open or create /var/run/crond.pid: Permission denied
executing top
答案 0 :(得分:1)
如何根据OpenShift Container Platform-Specific Guidelines 重新构建?例如相关的uid和gid。
答案 1 :(得分:0)
首先crond
必须代表其他用户调用命令。在没有root
的情况下怎么办?即使您将以某种方式与该用户一起运行此恶魔进程,也很有可能会缺少其他权限才能运行某些命令。
但是我想您可以尝试,也许这会有所帮助:
您的用户根本没有错误日志所述的权限。如果您要尝试以非root用户身份运行,请创建crond-users
,然后将/var/run/crond.pid
组从root
更改为crond-users
。最后但并非最不重要的一点是,将您的用户添加到crond-users
组。
像这样:
RUN groupadd crond-users && \
chgrp crond-users /var/run/crond.pid && \
usermod -a -G crond-users 1001510000
命中1
此外,泊坞窗默认入口点为/bin/bash -c
,但没有默认命令。因此,您的Dockerfile可能如下所示:
FROM centos:centos7.4.1708
RUN yum update -y && yum install -y cronie && rm -rf /var/lib/apt/lists/* && \
cd / && mkdir /code && \
chmod -R 755 /code/entrypoint.sh && \
useradd -l -u 1001510000 -c "1001510000" 1001510000 && \
addgroup crond-users && \
chgrp crond-users /var/run/crond.pid && \
usermod -a -G crond-users 1001510000
ADD entrypoint.sh /code/
USER 1001510000
CMD ["/code/entrypoint.sh", "top"]
提示2。
尝试避免多次使用相同的Dockerfile指令(如果您使用的是4x RUN)。每个指令在以后的构建映像中都是一个单独的层。这就是已知的Dockerfile best practice。
最小化层数在较旧版本的Docker中, 重要的是,您要尽量减少图像中的层数 确保他们表现出色。以下功能已添加到 减少此限制:
在Docker 1.10及更高版本中,仅创建RUN,COPY,ADD指令 层。其他说明创建临时的中间映像,并且 不要直接增加构建的大小。