😎

[VS Code] 一般ユーザーで起動中のコンテナを接続する

2022/11/17に公開

概要

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 

https://qiita.com/Yuki_Oshima/items/d3b52c553387685460b0
ファイルを正しく編集するには、USER_UIDとUSER_GIDはホストのIDと合わせる方が良い[1]

その他

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ごとの設定ファイルは無視されるので注意
https://code.visualstudio.com/docs/devcontainers/attach-container#_attached-container-configuration-files

脚注
  1. Dockerのvolumeでpermission deniedが発生した場合の解決法 ↩︎

  2. DockerfileのADD/COPYに--chownオプションができた ↩︎

  3. Dockerfileによるビルド ↩︎

Discussion