Dockerイメージ構築にあたってユーザー設定は必要なことですが、いくつかの勘違いが発覚しました。
TL; DR
- Dockerfileの
USER
はroot
を抜けても戻せる - Dockerfileの
COPY
は指定しないとroot
でファイルが作成される -
COPY --chown=
でユーザー設定可能
Dockerコンテナとユーザー
何も考えずにDockerコンテナを構築すると、「動作ユーザーがroot
」となってしまいます。もちろん動くといえば動くのですが、コンテナの中身を好き勝手に書き換え可能なのは好ましい状況ではありません。
ということで、Unix系のユーザーとファイルパーミッションを、Docker自体でも対応して設定可能です1。
いちばんわかりやすいものとしては、USER ユーザー名
のようにして、これ以降のコンテナ構築、そしてコンテナ実行時のユーザーを指定できます。
USER
に関する誤解…戻せる!
はじめ、DockerfileのUSER
は、Unix系でよくある「権限放棄」パターンと同じで、一度root
以外に切り替えたら戻せないと思っていました。
ところが、実際には自由に切り替えられる、つまり一度root
以外を指定してからまたroot
に戻れるものでした。必要な部分だけroot
になってまた戻る、みたいな作業も自由自在だったのです。
USER
とCOPY
の関係性
上のような誤解をしたまま書いていたDockerfile
で、USER user
のように切り替えてからCOPY
をかけたのですが、現在のユーザーでコピーが行われると想定していたところが、想定したように動かない事態に陥りました。
こちらは改めて調べてみればリファレンスにも明記してあったのですが、
新しいファイルやディレクトリは、オプションの
--chown
フラグでユーザ名、グループ名、UID/GID の組み合わせて追加対象の権限指定リクエストを指定しない限り、 UID と GID が 0 として作成されます。
ということで、COPY
はUSER
で設定したユーザーとは無関係に、作成したファイルやディレクトリへデフォルトでroot
を設定していきます。
変えたい場合は「別途chown
を実行する」までもなくCOPY --chown=user
のような指定が可能です。
外部リンク
脚注
-
Windowsコンテナもありますが、そもそも
USER
やchown
といったUnix系の権限設定機能そのものがLinuxコンテナ専用なので、今回の議論対象には入りません。 ↩