🐳

【Docker】ボリュームしたディレクトリ内のファイルが編集できない

2023/06/13に公開

はじめに

Dockerコンテナ内でファイルが編集出来なかったため、その対策をメモ。

原因と対策

Dockerでボリュームを扱う際、ホストとコンテナ間でのユーザーID (UID) やグループID (GID) の違いにより、権限問題が生じることがあります(これが原因でファイルの編集が出来なくなります)。

一つの解決策は、Dockerfileを使用してコンテナ内のUIDやGIDをホストのものと一致させることです。これは、例えば、ホストOSでファイルの所有者のUIDとGIDがそれぞれ1000と1000である場合、Dockerfileに以下のような記述を追加します:

# ユーザーとグループを作成
ARG USER_ID=1000
ARG GROUP_ID=1000
RUN groupadd -g $GROUP_ID groupname && \
    useradd -u $USER_ID -g $GROUP_ID username

# 以降の命令を新しく作成したユーザーで実行
USER username

ここで、ユーザーとグループのIDをビルド時の引数として渡しています。そして、このDockerfileからイメージをビルドするときに、ホストOSのユーザーとグループのIDを指定します:

docker build --build-arg USER_ID=$(id -u) --build-arg GROUP_ID=$(id -g) -t imagename .

id -uid -gは、現在のユーザーのUIDとGIDをそれぞれ取得します。

これで、ボリュームを通じてホストOSとコンテナがファイルを共有する際の権限問題が解決するはずです。

別の解決策としては、コンテナ起動後に権限を変更するという方法もありました。以下はその一例です:

docker exec container_id chown -R username:groupname /path/to/volume

ここで、username:groupnameはコンテナ内のユーザー名とグループ名で、/path/to/volumeはボリュームのパスを指しています。これは、既存のイメージを使ってコンテナを起動した後で、ボリュームの所有者を変更するものです。

Discussion