Dockerfileでchownが機能しないのはなぜですか?


85

私のDockerfileはディレクトリを作成し、それをchownし、その後ディレクトリを一覧表示します。ディレクトリはまだrootによって所有されています。何故ですか?

Dockerfileは次のとおりです。

FROM ubuntu:precise
RUN useradd -d /home/testuser -m -s /bin/bash testuser
RUN mkdir -p /var/local/testrunner/logs
VOLUME ["/var/local/testrunner/logs"]
RUN grep testuser /etc/passwd
RUN grep root /etc/passwd
RUN chown -R testuser:testuser /var/local/testrunner/logs
RUN ls -ld /var/local/testrunner/logs 

「dockerbuild」からの出力は次のとおりです。

Sending build context to Docker daemon 10.24 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:precise
 ---> ab8e2728644c
Step 1 : RUN useradd -d /home/testuser -m -s /bin/bash testuser
 ---> Using cache
 ---> 640f12671c86
Step 2 : RUN mkdir -p /var/local/testrunner/logs
 ---> Using cache
 ---> bf7756fd5b1f
Step 3 : VOLUME ["/var/local/testrunner/logs"]
 ---> Using cache
 ---> 65c73ee76c20
Step 4 : RUN grep testuser /etc/passwd
 ---> Using cache
 ---> db72fff0b965
Step 5 : RUN grep root /etc/passwd
 ---> Running in ebff78df7a9a
root:x:0:0:root:/root:/bin/bash
 ---> ead0ff704a59
Removing intermediate container ebff78df7a9a
Step 6 : RUN chown -R testuser:testuser /var/local/testrunner/logs
 ---> Running in c925f67b2ab4
 ---> 253132be935e
Removing intermediate container c925f67b2ab4
Step 7 : RUN ls -ld /var/local/testrunner/logs
 ---> Running in 978bc66aa47e
drwxr-xr-x 2 root staff 4096 Oct  1 15:15 /var/local/testrunner/logs

Dockerバージョン1.2.0、ビルドfa7b24f

ホストはUbuntu12.04を実行しますが、3.13.0-36-genericカーネルを使用します。


2
COPY後のonershipの問題については、次を参照してください:stackoverflow.com/questions/44766665/…–
そのブラジル人の男

回答:


127

私自身の質問に答える:それはボリュームであると宣言されています。VOLUME命令を外すと、chownが有効になります。

さらに、chownの実行にボリュームを宣言すると、chownの設定は有効なままになります。


18
「chownを実行した後にボリュームを宣言しても、chownの設定は有効なままです」これは、2日間困惑したことに対する答えです。ありがとうございました!
CashIsClay 2014

2
自分自身に答える:ここでの説明は私には意味をなさcontainer-solutions.com/2014/12/understanding-volumes-docker
マイケル・ハートル

4
上記の記事の重要なポイント:「[ボリュームを変更VOLUMEするRUNコマンドの後に指定された場合]、dockerは、ボリュームマウントの下のイメージに存在するファイルをボリュームにコピーし、所有権を正しく設定するのに十分賢いです。これは勝ちましたボリュームのホストディレクトリを指定した場合は発生しません(ホストファイルが誤って上書きされないようにするため)。 "
Gezim 2016

2
@MichaelHärtlによってリンクされた説明用に更新されたURLは次のとおり
solutions.com

5
dockerfileでVOLUMEを宣言していませんが、まだこの問題があります... :-(
fccoelho 2010年

8

このブログhttp://container42.com/2014/11/03/docker-indepth-volumes/この動作について詳しく説明しています。

Dockerfileの各命令は、新しいコンテナーを作成します。命令はこのコンテナにいくつかの変更を加え、新しいレイヤーになります。VOLUME命令が実際のコンテナファイルシステムに加えられる前に、「/ var / local / testrunner / logs」に加えられた変更。ただし、VOLUME命令の後、ディレクトリ「/ var / local / testrunner / logs」がマウントされたディレクトリになります。VOLUME命令の後にこのディレクトリに加えられた変更は、実際のコンテナファイルシステムではなく、マウントされたディレクトリに適用されます。


2

ボリュームなしでこの問題を経験している人にとって、私は複雑な回避策を見つけました。

問題:

次のような単純なDockerfileを使用します。

FROM ubuntu:16.04
RUN useradd -m -d /home/new_user new_user
COPY test_file.txt /home/new_user
RUN chown -R new_user:new_user /home/new_user
CMD ls -RFlag /home

実行後:

echo "A file to test permissions." > test_file.txt
docker build -t chown-test -f Dockerfile .
docker run --rm -it chown-test

出力は次のとおりです。

/home:
total 12
drwxr-xr-x 1 root 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:39 ../
drwxr-xr-x 1 root 4096 Jun 15 21:39 new_user/

/home/new_user:
total 24
drwxr-xr-x 1 root 4096 Jun 15 21:39 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
-rw-r--r-- 1 root  220 Aug 31  2015 .bash_logout
-rw-r--r-- 1 root 3771 Aug 31  2015 .bashrc
-rw-r--r-- 1 root  655 Jul 12  2019 .profile
-rw-r--r-- 1 root   28 Jun 11 19:48 test_file.txt

ご覧のとおり、ファイルの所有権(test_file.txtなど)は引き続きユーザーに関連付けられています root

解決:

chownコマンドで数値のUIDを使用すると、所有権を変更できることがわかりましたが、UIDが1000でない場合に限ります。そこで、のUIDに1を追加してからnew_user、所有権を変更しました。

FROM ubuntu:16.04
RUN useradd -m -d /home/new_user new_user
# change the uid of new_user to ensure it has whatever it was assigned plus 1 (e.g. if UID was 1000, now it'll be 1001)
RUN id -u new_user | awk '{print $1+1}' | xargs -I{} usermod -u {} new_user
COPY test_file.txt /home/new_user
RUN id -u new_user | xargs -I{} chown -R {}:{} /home/new_user
CMD ls -RFlag /home

実行後:

echo "A file to test permissions." > test_file.txt
docker build -t chown-test -f Dockerfile .
docker run --rm -it chown-test

出力は次のとおりです。

/home:
total 12
drwxr-xr-x 1 root 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
drwxr-xr-x 1 1001 4096 Jun 15 21:37 new_user/

/home/new_user:
total 24
drwxr-xr-x 1 1001 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
-rw-r--r-- 1 1001  220 Aug 31  2015 .bash_logout
-rw-r--r-- 1 1001 3771 Aug 31  2015 .bashrc
-rw-r--r-- 1 1001  655 Jul 12  2019 .profile
-rw-r--r-- 1 1001   28 Jun 11 19:48 test_file.txt

そもそもなぜこの問題が発生したのかわかりません。ただし、他の人がこの問題を抱えているように見えるので、回避策を投稿したいと思いました。私のユースケースは、jupyterノートブックを提供するDockerコンテナーを作成することでした。ノートブックを提供するためにroot以外のユーザーを作成しました。


1

私の経験でchownは、ルート(VOLUME /test)にマウントすると機能しません。ルート以外の場所(VOLUME /var/test)を使用します。


0

アルパインLinuxユーザ、私がしなければならなかったchown -R root .私が所有しようとしていたワークスペースに。CMDボリュームマウントはマウント時にファイルを上書きする可能性があると思うので、これはdockerfileので行う必要がありました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.