web-dev-qa-db-ja.com

ルート以外のユーザーとしてdockerコンテナーに接続する

実行時のデフォルトで

docker run -it [myimage]

OR

docker attach [mycontainer]

rootユーザーとして端末に接続しますが、別のユーザーとして接続したいと思います。これは可能ですか?

45
Andy59469

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)

本当に欲しいユーザーにアタッチしたい場合は、

  1. そのユーザーrun --user <user>から開始するか、Dockerfileを使用してUSERを使用して言及します
  2. `suを使用してユーザーを変更する
52
Larry Cai

次のようなコマンドを使用して、実行中のdockerコンテナーでシェルを実行できます。

docker exec -it --user root <container id> /bin/bash

36
Jason

DockerfileでUSERを指定できます。その後のすべてのアクションは、そのアカウントを使用して実行されます。 USERまたはCMDの1行前にENTRYPOINTを指定すると、コンテナの起動時にのみ(イメージの構築時にではなく)そのユーザーを使用することができます。結果のイメージからコンテナを開始すると、指定したユーザーとしてアタッチします。

5
kliew

私がそれを機能させることができる唯一の方法は:

docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v `pwd`:/siem mono bash
su - magnus

そのため、$ USER環境変数と/ etc/passwdファイルを指定する必要があります。このようにして、/ siemフォルダーでコンパイルし、ルートとしてではなくファイルの所有権を保持できます。

1
typelogic

私の解決策:

#!/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機構により、ビルドによって作成されたファイル/ディレクトリのユーザー所有権が許可されます。

これは私たちにとってはうまくいきますが。ちょっとハッキーな感じです。私は別の実装を受け入れています...

1
rmccabe3701

Www-dataユーザーとしてコマンドを実行:docker exec -t --user www-data container bash -c "ls -la"

0
Vasili Pascal