HOME/Articles/

Dockerのvolume mountしたディレクトリの中の所有者をコンテナの実行ユーザーに変更する

Article Outline

結論

Dockerfileでvolume mountするディレクトリをあらかじめ作成しておく

詳細

こんな感じのDockerfileがあり

FROM ruby:3.3.4-bullseye

ENV LANG=C.UTF-8
ENV TZ=Asia/Tokyo
ENV EDITOR=vim

EXPOSE 3000

RUN apt update -qq &&\
    apt upgrade -y &&\
    apt install -y --no-install-recommends \
    vim &&\
    rm -rf /var/lib/apt/lists/*

WORKDIR /usr/src/app

こんな感じのcompose.yamlがあり

services:
  app:
    build:
      context: .
    ports:
      - 3001:3000
    volumes:
      - ..:/usr/src/app
      - bundle:/usr/local/bundle:cached

こんな感じのdevcontainer.jsonがあり

{
  "name": "Rails App",
  "service": "app",
  "overrideCommand": true,
  "containerUser": "vscode",
  "features": {
    "ghcr.io/devcontainers/features/common-utils:2": {
      "username": "vscode"
    },
  }
}

コンテナの実行ユーザーが一般ユーザーの場合に、コンテナ起動後にbundle installを行うと/usr/local/bundle/cacheに書き込み権限がないとしてエラーになっていた。

/usr/local/bundle/cacheの権限を見ると、所有者のみ書き込み可能で所有者はrootユーザーになっていた。

volume対象のディレクトリがない場合、Dockerがよしなにディレクトリを生成してくれるが、その場合の所有者はrootとなり、この所有者や権限を後から変えることはできない。

なので、Dockerfileであらかじめディレクトリを作成しておく。

RUN mkdir -p /usr/local/bundle

これで /usr/local/bundle自体の所有者はroot(Dockerfile内の実行USER)だが、その中に作成されるディレクトリの所有者はコンテナの実行ユーザーとなった。