実行時のデフォルトで
docker run -it [myimage]
OR
docker attach [mycontainer]
rootユーザーとして端末に接続しますが、別のユーザーとして接続したいと思います。これは可能ですか?
docker run
の場合:
Dockerコンテナの起動時に別のユーザーに変更するには、オプション--user <user>
を追加するだけです。
docker run -it --user nobody busybox
docker attach
またはdocker exec
の場合:
このコマンドは既存のプロセスにアタッチ/実行するために使用されるため、現在のユーザーを直接使用します。
docker run -it busybox # CTRL-P/Q to quit
docker attach <container id> # then you have root user
/ # id
uid=0(root) gid=0(root) groups=10(wheel)
docker run -it --user nobody busybox # CTRL-P/Q to quit
docker attach <container id>
/ $ id
uid=99(nobody) gid=99(nogroup)
本当に欲しいユーザーにアタッチしたい場合は、
run --user <user>
から開始するか、Dockerfile
を使用してUSER
を使用して言及します次のようなコマンドを使用して、実行中のdockerコンテナーでシェルを実行できます。
docker exec -it --user root <container id> /bin/bash
DockerfileでUSER
を指定できます。その後のすべてのアクションは、そのアカウントを使用して実行されます。 USER
またはCMD
の1行前にENTRYPOINT
を指定すると、コンテナの起動時にのみ(イメージの構築時にではなく)そのユーザーを使用することができます。結果のイメージからコンテナを開始すると、指定したユーザーとしてアタッチします。
私がそれを機能させることができる唯一の方法は:
docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v `pwd`:/siem mono bash
su - magnus
そのため、$ USER環境変数と/ etc/passwdファイルを指定する必要があります。このようにして、/ siemフォルダーでコンパイルし、ルートとしてではなくファイルの所有権を保持できます。
私の解決策:
#!/bin/bash
user_cmds="$@"
GID=$(id -g $USER)
UID=$(id -u $USER)
RUN_SCRIPT=$(mktemp -p $(pwd))
(
cat << EOF
addgroup --gid $GID $USER
useradd --no-create-home --home /cmd --gid $GID --uid $UID $USER
cd /cmd
runuser -l $USER -c "${user_cmds}"
EOF
) > $RUN_SCRIPT
trap "rm -rf $RUN_SCRIPT" EXIT
docker run -v $(pwd):/cmd --rm my-docker-image "bash /cmd/$(basename ${RUN_SCRIPT})"
これにより、ユーザーはmy-docker-image
が提供するツールを使用して任意のコマンドを実行できます。ユーザーの現在の作業ディレクトリが、コンテナ内の/cmd
にボリュームマウントされていることに注意してください。
私はこのワークフローを使用して、開発チームがarm64ターゲットのC/C++コードをクロスコンパイルできるようにします。このターゲットのbspは、my-docker-image
にクロスコンパイラ、sysroot、make、cmakeなどが含まれています。これにより、ユーザーは次のようなことが簡単にできます。
cd /path/to/target_software
cross_compile.sh "mkdir build; cd build; cmake ../; make"
cross_compile.sh
は上記のスクリプトです。 addgroup/useradd
機構により、ビルドによって作成されたファイル/ディレクトリのユーザー所有権が許可されます。
これは私たちにとってはうまくいきますが。ちょっとハッキーな感じです。私は別の実装を受け入れています...
Www-dataユーザーとしてコマンドを実行:docker exec -t --user www-data container bash -c "ls -la"