😎
[VS Code] 一般ユーザーで起動中のコンテナを接続する
概要
VSCodeのDev Containerを使って起動中のコンテナに接続する場合に一般ユーザーとして接続する
ユーザー作成
下記をDockerfileに追加してsudo権限を持ったvscodeというユーザーを作成
# Add non-root user
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \
&& apt-get install -y sudo \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME\
&& chmod 0440 /etc/sudoers.d/$USERNAME
その他
COPYコマンドで--chownオプションを付けると追加したユーザーの所有にできる[2]
USERコマンドを使うとRUN, CMD, ENTRYPOINT, docker run, execの実行ユーザーを変更可能[3]
[追記] Dev Container内のユーザーのIDをホスト側のユーザーのIDに合わせたい場合
ユーザーIDとグループIDを環境変数に格納
export USER_ID=$(id -u)
export GROUP_ID=$(id -g)
docker-compose.yamlで環境変数を引数として引き渡し
version: '3'
services:
dev_container:
build:
args:
- USER_ID=$USER_ID
- GROUP_ID=$GROUP_ID
引数を使ってユーザー作成
# Add non-root user
ARG USERNAME=vscode
ARG USER_ID
ARG GROUP_ID
RUN groupadd --gid $GROUP_ID $USERNAME \
&& useradd -s /bin/bash --uid $USER_ID --gid $GROUP_ID -m $USERNAME \
&& apt-get install -y sudo \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME\
&& chmod 0440 /etc/sudoers.d/$USERNAME
設定ファイル変更
VSCodeで起動中のコンテナに接続した状態で、コマンドパレットからDev Containers: Open Container Configuration Fileを選ぶことで、コンテナの設定ファイルを開く(ローカル側に置かれている)
デフォルトではimageごとの設定だが、Dev Containers: Open Named Configuration Fileでコンテナの名前ごとの設定ファイルも利用できる
設定ファイルにremoteUserの設定を追加する
{
// Container user VS Code should use when connecting
"remoteUser": "vscode",
}
この状態でコンテナに再接続すればユーザーが変更される
なお、Dev Containers: Open Named Configuration Fileで名前ごとの設定ファイルを作成すると、imageごとの設定ファイルは無視されるので注意
Discussion