root以外のユーザーとしてLinuxでユーザーを追加する方法

root以外のユーザーとしてLinuxでユーザーを追加する方法

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"]

次に、2番目のステップとしてpodmanを使用してコンテナを構築できます(引数を渡す必要はなく、デフォルトの引数を使用します)。

podman build --rm -t local/c7-ssample . && podman run --name centos-test --rm -it local/c7-ssample

dockerデーモンはルートで実行されるため、Centos 7 / RH 7に適しています。

この問題は、新しいオペレーティング システム 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指摘した。

テストする必要がありますが、後で更新します。

関連情報