DevContainer を root でないユーザで起動する#
VSCode の DevContainer でコンテナ上のユーザを root にしていると、 ホスト OS 上とコンテナ内とで使用するユーザ名が異なることにより、 ファイルの権限に関する問題がしばしば発生する。 そこで、コンテナ内でもホスト上と同じユーザを使用できるようにする方法が VSCode 公式ドキュメントの Add a non-root user to a container に紹介されている。
概要#
ファイルの権限はユーザ名でなく UID によって管理されているため、 ホスト上と UID が同じユーザを DevContainer のコンテナ上に用意し、 そのユーザで作業をするようにすれば良い。
手順#
1. Docker イメージに作業用のユーザを用意する#
DevContainer を root でないユーザで起動するには、
まず使用する Docker イメージ内に root でない作業用のユーザを 1 つ用意しておく必要がある。
Docker イメージの中には最初から root でないユーザが UID 1000 で用意されていることがあるため、
cat /etc/passwd
コマンドなどでユーザの一覧を確認しておく。
ユーザがない場合は以下のように追加する。
ARG USERNAME=vscode # ユーザ名。必要に応じて変更する。
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid $USER_GID $USERNAME && \
useradd --uid $USER_UID --gid $USER_GID -m $USERNAME
2. Docker イメージ内に sudo コマンドを用意する#
DevContainer で作業中にソフトウェアのインストールなどで root ユーザの権限が必要になる場合がある。 しかし、Docker イメージの中には sudo コマンドがインストールされていないことがよくある。 そこで、sudo コマンドを必要に応じてインストールしておく。
Hint
Ubuntu であれば以下のような Dockerfile の記述で sudo コマンドがインストールできる。
RUN apt-get update && \
# sudo コマンドのインストール
apt-get install -y sudo && \
# 作業用のユーザで sudo コマンドが使用できるようにする。
echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME && \
chmod 0440 /etc/sudoers.d/$USERNAME
3. root ユーザでしか使えないツールがないか確認する#
root ユーザで使用する前提でインストールしたツールが root でないユーザでは使用できないことがあるため、 必要に応じて作業用のユーザでも使用できるように追加のインストール処理を行う。
Note
このサイトを作成しているリポジトリでは、 Python の環境を管理する pyenv と poetry を作業用のユーザでも使えるように Dockerfile を調整する必要があった。
# pyenv を root ユーザ以外からでも使用できるように権限を変更
RUN chmod 0777 /root && \
chmod -R 0777 /root/.pyenv
# poetry を作業用のユーザにもインストールしておく。
USER $USERNAME
WORKDIR /home/$USERNAME
ENV PATH="/home/$USERNAME/.local/bin:$PATH"
RUN pipx install poetry
4. DevContainer の設定で作業用のユーザ名を指定する#
DevContainer を使用するリポジトリの .devcontainer/devcontainer.json
ファイルで
以下のようにコンテナ内で使用するユーザ名を設定する。
{
// Docker イメージ内に用意した作業用のユーザ名を指定する。
"remoteUser": "vscode"
// (その他既存の設定はそのまま)
}