ども!一週間の業務がDocker関連業務で、悩まされている龍ちゃんです。Docker系の問題は単に使うだけでは出会わないので、調査も時間がかかります。今回は、そんな時に出会った問題です。
今回のテーマはDocker Desktop環境で発生した問題です。内容は「nodeのDocker Imageをビルドした際、COPY --chown=node:node
が動かず、1001や1002になる」です。
こちらの問題ですが、WSL+Docker CLIの構成のみでは起きませんでした。WSL+Docker Desktop環境でのみ発生した問題になっています。
起因については、わかりません。発生パターンと回避方法が分かったのでブログとしてまとめていきます。
発生した問題
以下のDockerfileをDocker Compose環境でビルドした際に発生していました。COPY --chown=node:node ./next-app .
でコンテナーに移したファイルの権限が、環境によってはnode
・1001~1003
になってしまう問題が発生していました。
ARG NODE_VER="latest"
FROM node:${NODE_VER}
RUN npm install -g npm
USER node
WORKDIR /home/node/app
RUN mkdir next-app
WORKDIR /home/node/app/next-app
RUN mkdir node_modules
RUN chown node:node -R node_modules
COPY --chown=node:node ./next-app .
RUN npm install
発生パターン調査
まずは、WSL+Docker CLI環境では発生せずにDocker Desktop環境でのみ発生していました。上記の問題について、人によってはビルドが成功(ファイル権限がnode)していました。ですが、1001~1003までの広い範囲でファイル権限が変更されていました。
1001~1003までのファイル権限で、実行された環境のユーザーUID:GIDを調査したところファイル権限とUID:GIDが一致していました。よって問題としては、以下になります。
「Docker Desktop環境でCOPY --chown
コマンドを実行した際にWSL実行ユーザーでファイルがマウントされる」
対応法
暫定的な対応方法は以下の2ステップです
- WSL実行ユーザーのUID:GIDを取得する
- 修正したDockerfileに実行ユーザーのUID:GIDを指定してビルド
まずは、以下のコマンドでWSL実行ユーザーのUIDとGIDを一括で取得します。
id
取得できた情報を以下のDockerfileへ反映させます。
ARG NODE_VER=latest
FROM node:${NODE_VER}
# 非rootユーザーを作成
ARG USERNAME=vscode
# ユーザーのUIDとGIDを指定
# デフォルトは1000:1000
ARG USER_UID=1000
ARG USER_GID=$USER_UID
ENV WORKDIR=/home/$USERNAME
RUN npm install -g npm
# nodeを削除(1000:1000を開ける)
RUN userdel -r node
RUN groupadd --gid $USER_GID $USERNAME \\
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \\
&& apt update \\
&& apt install -y sudo \\
&& echo $USERNAME ALL=\\(root\\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \\
&& chmod 0440 /etc/sudoers.d/$USERNAME
USER $USERNAME
WORKDIR $WORKDIR
RUN mkdir next-app
WORKDIR $WORKDIR/next-app
RUN mkdir node_modules
RUN chown $USER_UID:$USER_GID -R node_modules
COPY --chown=$USER_UID:$USER_GID ./next-app .
RUN npm install
nodeのDocker Imageでは、nodeユーザーが1000を使用しています。UIDを指定してユーザーを作成する場合は、そのUIDを使用しているユーザーがいる場合は失敗するため、先回りしてnodeユーザーを削除しています。
知りたいこと
本稿で紹介した問題について、以下の点がまだ不明確です。
- なぜDocker Desktop環境でのみCOPYコマンドの挙動が異なるのか
- この問題に対する根本的な解決方法はあるのか
これらの点について、さらなる調査や情報提供をいただけると幸いです。ぜひ!根本原因について知っている方、実行ユーザーのUID:GIDを移す方法に関してベストプラクティスを知っている方がいれば、教えてください。
おわり
本記事では、Docker Desktop環境でCOPYコマンドの挙動が異なる問題について解説しました。この問題に対する暫定的な解決策は見つかりましたが、根本的な原因についてはまだ調査が必要です。今後も新しい情報が得られ次第、アップデートしていきたいと思います。