Dockerコンテナで作成されたファイルはルートが所有します。

Dockerコンテナで作成されたファイルはルートが所有します。

エラーが発生したときにログに似たファイルを生成するDockerイメージがあります。バインドマウントを使用してホストに書き込むディレクトリをマウントしました。ところで生成されたファイルはrootchownchgrp

コンテナにファイルの所有者とグループをコンテナを実行しているユーザーの所有者とグループに設定する方法はありますか?

いくつかの文脈で私が作ったおもちゃの例は次のとおりです。

ドッカーファイル

FROM debian

WORKDIR /root
VOLUME /root/output

COPY run.sh /root/

ENTRYPOINT ["./run.sh"]

実行sh

#!/bin/bash

echo hello > output/dump

私の実行コマンドは

docker run -v $PWD/output:/root/output test

答え1

これらのファイルは、コンテナ内で実行されているユーザーによって生成されます。コンテナ化コマンドが実行されると、rootすべてのファイルがルートとして生成されます。

別のユーザーとしてファイルを作成するには、別のユーザーとしてコンテナを実行します。例えば

docker run -v "$(pwd)/output":/root/output -u $(whoami) test

注:コンテナによっては、この機能がデフォルトで機能しない場合があります(たとえば、コンテナ内で特権ポートを開く必要があるか、スクリプトが特定の(スーパー)ユーザーだけにアクセスできるため)。

答え2

これは古い既知のエラー。回避策として使用できますボードマン、Dockerと互換性があり、追加を提案しましたalias docker=podman。ここでの質問の1つの利点は、Podmanがrootとして実行されるサービスを必要としないことです。セキュリティに良いだけでなく、実際にこのようなミスを防止してくれます。

デモ:

$ ls -l /tmp/hello
ls: cannot access 'hello': No such file or directory
$ podman run --rm -v /tmp/:/mnt/ -it ubuntu:22.04 sh -c "touch /mnt/hello && ls -l /mnt/hello"
-rw-r--r--. 1 root root 0 Sep 26 03:57 /mnt/hello
$ ls -l /tmp/hello
-rw-r--r--. 1 konstantin konstantin 0 сен 26 06:57 hello

関連情報