루트가 아닌 사용자가 Linux에서 사용자를 추가하는 방법

루트가 아닌 사용자가 Linux에서 사용자를 추가하는 방법

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

docker 데몬이 루트에서 실행되기 때문에 Centos 7/RH 7에서 완벽하게 작동합니다.

새로운 OS Centos 8 / RH 8에서 사용자가 루트가 아닌 사용자로 실행되는 podman을 사용하려고 할 때 문제가 발생합니다.

이미지를 실행할 때 발생하는 오류(이치에 맞습니다):

groupadd: /etc/group.11: lock file already used
groupadd: cannot lock /etc/group; try again later.

루트가 아닌 사용자로 사용자를 추가할 수 있도록 사용자에게 권한을 부여하는 방법에 대해 알고 계시나요?

업데이트:

가능한 해결 방법(원하지 않음)은 --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지적했다.

테스트를 해야 하고 나중에 업데이트하겠습니다.

관련 정보