![非root用户如何在linux中添加用户](https://linux22.com/image/170316/%E9%9D%9Eroot%E7%94%A8%E6%88%B7%E5%A6%82%E4%BD%95%E5%9C%A8linux%E4%B8%AD%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7.png)
我正在尝试以非 root 用户身份在 Centos 8 / RH 8 上启动一个容器,同时我想动态地为该容器创建一个用户。
我正在使用入口点脚本来执行以下示例:
$ cat docker-entrypoint.sh
#!/bin/bash
set -e
if [[ "$(id -u)" -eq "0" ]] && [[ -n "${UID_ENV}" ]] && [[ -n "${USERNAME_ENV}" ]]
then
if [[ -z "$(getent passwd ${UID_ENV})" ]] && [[ -z "$(getent passwd ${USERNAME_ENV})" ]] && [[ -z "$(getent group ${UID_ENV})" ]]
then
groupadd -g ${GID_ENV} -r ${USERNAME_ENV} && \
useradd -rm -u ${UID_ENV} -g ${GID_ENV} ${USERNAME_ENV}
else
echo "User: $(getent passwd "${UID_ENV}" | cut -d: -f1) with uid: ${UID_ENV} already exists"
fi
if [[ -n "${VOLUMES_ENV})" ]]
then
for vol in ${VOLUMES_ENV}
do
echo "Chown Directory: ${vol} with parameters: ${UID_ENV}:${GID_ENV}"
chown -R ${UID_ENV}:${GID_ENV} ${vol}
done
fi
exec su-exec "${USERNAME_ENV}" "$@"
else
if ! [[ `whoami 2>/dev/null` ]]
then
echo "Do not use the 'docker run -u ...' on this image!"
exit 1
fi
exec "$@"
fi
在 Dockerfile 上,您可以定义参数,例如:
ENV FROM centos:7
ENV=${UID_ENV:-"12345"}
ENV GID_ENV=${GID_ENV:-"12345"}
ENV VOLUMES_ENV=""
ENV USERNAME_ENV=${USERNAME_ENV:-"test-user"}
COPY ["docker-entrypoint.sh", "/usr/local/bin/"]
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["/bin/bash"]
然后,作为第二步,您可以使用 podman 构建容器(无需传递参数,它将使用默认参数):
podman build --rm -t local/c7-ssample . && podman run --name centos-test --rm -it local/c7-ssample
这非常适合 Centos 7 / RH 7,因为 docker 守护进程在 root 下运行。
当在新操作系统 Centos 8 / RH 8 上用户想要使用以非 root 用户身份运行的 podman 时,就会出现此问题。
运行图像时遇到的错误(这是有道理的):
groupadd: /etc/group.11: lock file already used
groupadd: cannot lock /etc/group; try again later.
知道如何授权用户能够将用户添加为非 root 用户吗?
更新:
可能的解决方法(不需要)是--build-arg
在构建期间将 作为参数传递。代码/配置示例:
ENV FROM centos:7
ARG ARG_UID=${ARG_UID:-"12345"}
ARG ARG_GID=${ARG_GID:-$ARG_UID}
ARG ARG_VOLUMES=""
ARG ARG_USERNAME=${ARG_USERNAME:-"test-user"}
ENV UID_ENV=${ARG_UID}
ENV GID_ENV=${ARG_GID}
ENV VOLUMES_ENV=${ARG_VOLUMES}
ENV USERNAME_ENV=${ARG_USERNAME}
COPY ["docker-entrypoint.sh", "/usr/local/bin/"]
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["/bin/bash"]
然后在构建期间,如果您决定覆盖,则需要传递参数:
podman build --rm --build-arg ARG_UID=54321 -t local/c7-ssample . && podman run --name centos-test --rm -it local/c7-ssample
但该解决方案可能包含在 RH 8.2 中,如下所示AB指出。
我需要拉测试,稍后我会更新。