DockerfileのベースイメージとしてAlpine
(またはAlpineに基づくイメージ)を使用しています。ユーザーを作成するには、どの指示を追加する必要がありますか?
最終的には、このユーザーを使用して、コンテナーに配置するアプリケーションを実行し、rootユーザーが実行しないようにします。
Alpineは、_adduser
およびaddgroup
ではなく、useradd
およびusergroup
コマンドを使用してユーザーとグループを作成します。
FROM Alpine:latest
# Create a group and user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
# Tell docker that all future commands should run as the appuser user
USER appuser
adduser
のフラグは次のとおりです。
使用法:adduser [オプション]ユーザー[グループ] 新しいユーザーを作成するか、ユーザーをグループに追加します -h DIRホームディレクトリ -g GECOS GECOSフィールド -sシェルログインシェル -G GRPグループ -Sシステムユーザーを作成します -D割り当てないパスワード -Hホームディレクトリを作成しない -u UIDユーザーID -k SKELスケルトンディレクトリ(/etc/skel)
コマンドはadduser
およびaddgroup
です。
以下は、busybox環境(Alpine)およびDebianベースの環境(Ubuntuなど)で使用できるDockerのテンプレートです。
ENV USER=docker
ENV UID=12345
ENV GID=23456
RUN addgroup --gid "$GID" "$USER" \
&& adduser \
--disabled-password \
--gecos "" \
--home "$(pwd)" \
--ingroup "$USER" \
--no-create-home \
--uid "$UID" \
"$USER"
次のことに注意してください。
--disabled-password
は、パスワードの入力を要求しません--gecos ""
は、Debianベースのシステムで「フルネーム」などのプロンプトを回避します--home "$(pwd)"
は、ユーザーのホームをWORKDIRに設定します。 これは必要ないかもしれません。--no-create-home
は、/etc/skel
からクラフがディレクトリにコピーされるのを防ぎますこれらのアプリケーションの使用法の説明は、adduser および addgroup のコードに存在する長いフラグが欠落しています=。
次の長い形式のフラグは、Alpineとdebian-derivativeの両方で機能するはずです。
BusyBox v1.28.4 (2018-05-30 10:45:57 UTC) multi-call binary.
Usage: adduser [OPTIONS] USER [GROUP]
Create new user, or add USER to GROUP
--home DIR Home directory
--gecos GECOS GECOS field
--Shell SHELL Login Shell
--ingroup GRP Group (by name)
--system Create a system user
--disabled-password Don't assign a password
--no-create-home Don't create home directory
--uid UID User id
注意すべきことの1つは、--ingroup
が設定されていない場合、UIDと一致するようにGIDが割り当てられることです。指定されたUIDに対応するGIDがすでに存在する場合、adduserは失敗します。
BusyBox v1.28.4 (2018-05-30 10:45:57 UTC) multi-call binary.
Usage: addgroup [-g GID] [-S] [USER] GROUP
Add a group or add a user to a group
--gid GID Group id
--system Create a system group
ホストUID/GIDとしてコンテナーを実行するための fixuid プロジェクトに対する独自の代替を作成しようとしたときに、このすべてを発見しました。
私のエントリポイントヘルパースクリプト はGitHubにあります。
その目的は、そのスクリプトをENTRYPOINT
の最初の引数として追加することです。これにより、Dockerは関連するバインドマウントからUIDとGIDを推測するはずです。
環境変数「TEMPLATE」は、アクセス許可を推測する場所を決定するために必要になる場合があります。
(執筆時点では、スクリプトのドキュメントはありません。それはまだtodoリストにあります!!)