# Windows WSL LT 【Windowsの会】Windows&WSL LT会 --- Windows&WSLを使っていると遭遇する権限問題について --- Windowsを使っているとこんなエラーに遭遇しませんか? --- ![スクリーンショット 2024-07-07 172857](https://hackmd.io/_uploads/BJ3udWhvA.png) --- 今回のLT 権限エラーが発生する原因と自分でDocker環境を作る際の解決方法について解説します --- エラーの原因 Docker内で作られたファイルの権限 --- Dockerはユーザーの設定を行わないとrootユーザーでコンテナが起動します --- ![wsl](https://hackmd.io/_uploads/B1IcOZnPA.png) --- ![wsl2](https://hackmd.io/_uploads/B1FsdbhDA.png) --- つまり Docker内で作られたファイルはWSLに反映される WSL内で作られたファイルはDockerに反映される --- それぞれの権限を確認してみましょう --- WSL内 ``` kenchaso@LAPTOP-MK2A8IOV:~/workspace/ruby_workspace$ whoami kenchaso kenchaso@LAPTOP-MK2A8IOV:~/workspace/ruby_workspace$ id kenchaso uid=1000(kenchaso) gid=1000(kenchaso) groups=1000(kenchaso)..... kenchaso@LAPTOP-MK2A8IOV:~/workspace/ruby_workspace$ ls -l total 8 -rw-r--r-- 1 kenchaso kenchaso 117 Jul 7 18:39 Dockerfile -rw-r--r-- 1 kenchaso kenchaso 79 Jul 7 18:39 compose.yml -rw-r--r-- 1 kenchaso kenchaso 0 Jul 7 18:48 wsl.txt ※ whoami: ログインしているユーザー名を表示するコマンド ※ id: ユーザーの識別情報を表示するコマンド ``` --- Docker内 ``` root@5c9b93acc1cc:/app# whoami root root@5c9b93acc1cc:/app# id root uid=0(root) gid=0(root) groups=0(root) root@5c9b93acc1cc:/app# touch docker.txt root@5c9b93acc1cc:/app# ls -l total 8 -rw-r--r-- 1 1000 1000 117 Jul 7 09:39 Dockerfile -rw-r--r-- 1 1000 1000 79 Jul 7 09:39 compose.yml -rw-r--r-- 1 root root 0 Jul 7 09:49 docker.txt -rw-r--r-- 1 1000 1000 0 Jul 7 09:48 wsl.txt ``` --- この違いがエラーの原因 Docker内で作られたファイルはrootユーザーが作ったファイル WSL内で作られたファイルはkenchaso(WSLのユーザー)が作ったファイルになる --- root権限のファイルにアクセスするためにはroot権限が必要 そのためWSL上でsudoを使うとファイルの操作が出来る --- 解決方法1 ファイルの権限をWSLでログインしているユーザーに変更する ``` sudo chown -R $USER:$USER . ※ chown: ファイルやディレクトリの所有者やグループを変更するコマンド ※ -R: 再帰的にディレクトリ内のファイルやディレクトリの所有者やグループを変更するオプション ``` --- 解決方法2 Docker内で使用するユーザーを設定してファイルがrootユーザーで作られないようにする --- もともと使用していたDockerfileとcompose.yml ``` FROM ruby:3.2.3 WORKDIR /app ``` ``` services: app: build: . volumes: - .:/app ``` --- ユーザーの設定を行ったDockerfileとcompose.yml ``` FROM ruby:3.2.3 RUN useradd -m -u 1000 ruby RUN mkdir /app RUN chown ruby:ruby /app WORKDIR /app ``` ``` services: app: build: . volumes: - .:/app user: 1000:1000 ``` --- コードの解説 --- useradd: ユーザーを追加するコマンド --- -m: ユーザーのホームディレクトリを作成するオプション --- -u: ユーザーのUIDを指定するオプション --- chown: ファイルやディレクトリの所有者やグループを変更するコマンド --- user: コンテナ内で使用するユーザーを指定するオプション `1000:1000`: UIDとGIDを指定 --- つまり イメージにuidが1000(WSL側のユーザーと同じuid)のユーザーを作成 composeで使用するユーザーのuidを1000に指定 --- 実際に動かしてみると --- WSL内 ``` kenchaso@LAPTOP-MK2A8IOV:~/workspace/ruby_workspace$ touch wsl.txt kenchaso@LAPTOP-MK2A8IOV:~/workspace/ruby_workspace$ ls -l total 8 -rw-r--r-- 1 kenchaso kenchaso 96 Jul 7 19:18 Dockerfile -rw-r--r-- 1 kenchaso kenchaso 77 Jul 7 19:18 compose.yml -rw-r--r-- 1 kenchaso kenchaso 0 Jul 7 19:31 wsl.txt ``` --- Docker内 ``` ruby@1070e8436d08:/app$ touch docker.txt ruby@1070e8436d08:/app$ ls -l total 8 -rw-r--r-- 1 ruby ruby 96 Jul 7 10:18 Dockerfile -rw-r--r-- 1 ruby ruby 77 Jul 7 10:18 compose.yml -rw-r--r-- 1 ruby ruby 0 Jul 7 10:32 docker.txt -rw-r--r-- 1 ruby ruby 0 Jul 7 10:31 wsl.txt ``` --- Docker内から見るとDocker内で作られたファイルもWSL内で作られたファイルもユーザーがrubyになっている --- WSLに戻ってファイルを確認すると ``` kenchaso@LAPTOP-MK2A8IOV:~/workspace/ruby_workspace$ ls -l total 8 -rw-r--r-- 1 kenchaso kenchaso 96 Jul 7 19:18 Dockerfile -rw-r--r-- 1 kenchaso kenchaso 77 Jul 7 19:18 compose.yml -rw-r--r-- 1 kenchaso kenchaso 0 Jul 7 19:32 docker.txt -rw-r--r-- 1 kenchaso kenchaso 0 Jul 7 19:31 wsl.txt ``` --- WSLから見てもDocker内で作られたファイルもWSL内で作られたファイルもユーザーがkenchasoになっている ※ uidを1000に指定しているため、Docker内だとrubyになり、WSL内だとkenchaso(WSLのuidが1000のユーザー)になる --- Railsの場合は下記の資料を参考にしてください https://hackmd.io/@SKjw2RY-RNCUNSdJfEWPig/BJvZhOLv0 --- Dockerfile ``` FROM ruby:3.2.3 ARG UID=1000 ENV LANG C.UTF-8 ENV TZ Asia/Tokyo ENV BUNDLE_APP_CONFIG /myapp/.bundle RUN apt-get update -qq \ && apt-get install -y ca-certificates curl gnupg \ && mkdir -p /etc/apt/keyrings \ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ && NODE_MAJOR=20 \ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \ && wget --quiet -O - /tmp/pubkey.gpg https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn vim RUN useradd -m -u $UID rails RUN mkdir /myapp WORKDIR /myapp COPY . /myapp RUN chown rails:rails -R /myapp ``` --- compose.yml ``` services: db: image: postgres restart: always environment: TZ: Asia/Tokyo POSTGRES_PASSWORD: password volumes: - postgresql_data:/var/lib/postgresql ports: - 5432:5432 healthcheck: test: ["CMD-SHELL", "pg_isready -d myapp_development -U postgres"] interval: 10s timeout: 5s retries: 5 web: build: context: . dockerfile: Dockerfile.dev command: bash -c "bundle install && bundle exec rails db:prepare && rm -f tmp/pids/server.pid && ./bin/dev" tty: true stdin_open: true volumes: - .:/myapp environment: TZ: Asia/Tokyo ports: - "3000:3000" user: "1000:1000" depends_on: db: condition: service_healthy volumes: postgresql_data: ``` --- 以前公開した資料との違い https://hackmd.io/@SKjw2RY-RNCUNSdJfEWPig/HJE0GUClC --- - Dockerfile内でuidが1000のユーザーを追加 - node_modulesをvolumeからホストマシンのnode_modulesをそのまま使うように変更 - gemをvendor/bundleにインストールするように変更 - composeで使用するユーザーのuidとgidを1000に指定 --- ## おまけ --- WSLからcodecommitとの接続を行う際に毎回認証情報を入力しないといけない問題の解決方法 --- 解決方法1 git cloneするときにURLに認証情報を含めてしまう `https://username:password@カリキュラムで指定されているcodecommitのURL` ※ git remoteの情報を書き換えても出来ます --- 解決方法2 認証情報を`~/.git-credentials`に平文保存する設定を行う ``` git config credential.helper store git pull origin master ``` --- global設定を行うと`~/.gitconfig`にstoreを使って認証情報を保存する設定が書き込まれる → 今後すべてのhttpを使った形式のgitのやり取りが対象になる ``` git config --global credential.helper store cat ~/.gitconfig ``` --- local設定を行う(なんも指定しなくても同じ)と`.git/config`にstoreを使って認証情報を保存する設定が書き込まれる → 今操作しているリポジトリだけが対象になる ``` git config --global credential.helper store cat .git/config ``` --- ## おわり