Docker Desktopで起きるCOPY –chownが権限通りにマウントされない問題|調査と対応

Docker Desktopで起きるCOPY --chownが権限通りにマウントされない問題|調査と対応

ども!一週間の業務が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 .でコンテナーに移したファイルの権限が、環境によってはnode1001~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ステップです

  1. WSL実行ユーザーのUID:GIDを取得する
  2. 修正した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コマンドの挙動が異なる問題について解説しました。この問題に対する暫定的な解決策は見つかりましたが、根本的な原因についてはまだ調査が必要です。今後も新しい情報が得られ次第、アップデートしていきたいと思います。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です