web-dev-qa-db-ja.com

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

Dockerfileはディレクトリを作成し、それをchownし、その後ディレクトリをリストします。ディレクトリはまだルートが所有しています。何故ですか?

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 

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

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

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

58
user100464

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

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

100
user100464

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

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

7
hobgoblin

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

0
Mike