web-dev-qa-db-ja.com

Alpineをベースイメージとして使用しているときにユーザーを追加するにはどうすればよいですか?

DockerfileのベースイメージとしてAlpine(またはAlpineに基づくイメージ)を使用しています。ユーザーを作成するには、どの指示を追加する必要がありますか?

最終的には、このユーザーを使用して、コンテナーに配置するアプリケーションを実行し、rootユーザーが実行しないようにします。

48
Daniel Gartmann

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)
100
Daniel Gartmann

コマンドは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は失敗します。

addgroup

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リストにあります!!)

20
rexypoo