ルート権限がないDockerコンテナにファイルを追加する方法は?


16

公式tomcatイメージから作成されたDockerイメージにファイルを追加しようとしています。tomcatbashを実行するとユーザーとしてログインしているため、そのイメージにはルート権限がないようです。

docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$ 

Dockerfileファイルをそのコンテナにコピーするように指示した場合、ファイルには権限が644あり、所有者はrootです。私の知る限り、Dockerfile内のすべてのコマンドはrootとして実行されるため、これは妥当なようです。ただし、そのファイルの所有権をに変更しようとするとtomcat:tomcatOperation not permittedエラーが発生します。

そのイメージにコピーされたファイルの権限を変更できないのはなぜですか?

再現方法:

mkdir docker-addfilepermission
cd docker-addfilepermission
touch test.txt
echo 'FROM tomcat
COPY test.txt /usr/local/tomcat/webapps/
RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfile

docker build .

の出力docker build .

Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM tomcat
 ---> 44859847ef64
Step 1 : COPY test.txt /usr/local/tomcat/webapps/
 ---> Using cache
 ---> a2ccb92480a4
Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt
 ---> Running in 208e7ff0ec8f
chown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted
2014/11/01 00:30:33 The command [/bin/sh -c chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt] returned a non-zero code: 1

回答:


20

TomcatのDockerfileを表示および変更する方法はおそらくありますが、数分後にはわかりません。私のエレガントな解決策は、chownの前に次の行を追加することです。

USER root

(推奨)後に特権を降格したい場合は、次の行を追加できます。

USER tomcat

または、ソフトウェアがインストールされていないイメージを操作して、Dockerfileをルートとして開始し、tomcatなどをインストールできるようにします。実際、彼らが私の経験からイメージを変えているのは奇妙です。目的のエンドユーザーが適切と思われるUSERディレクティブを設定できるようにすることは理にかなっています。


これは確かに機能します!ADDコマンドとCOPYコマンドが所有者でファイルを作成する理由を偶然知っていますrootか?USER指令を考慮に入れないのはなぜですか?
NYI

1
まあ、通常、ディレクティブを設定するベースイメージは表示されません。システム上にどのユーザーアカウントが存在するかを知る実際の方法がないからです。また、Dockerを実行する必要があるため、ファイルをルートとして作成する方が簡単な場合もあります。合理的な拡張要求のように思えますが、USERディレクティブで設定されたものが自動的に所有される場合、Dockerfileの構築が簡単になります。
theterribletrivium 14年

ありがとう。本当に私の不幸から私を追い出した。Jenkinsイメージにsshキーを追加する必要がありました。
コスタデミリス

8

Docker 17.09以降--chown、DockerfileのADD / COPY操作でフラグを使用して、前述のように画像のサイズを増やすchownを使用した個別のRUN操作ではなく、ADD / COPYステップ自体の所有者を変更できます。これをデフォルトモードにすると良いでしょう。つまり、ファイルをコピーするユーザーの許可がコピーされたファイルに適用されます。ただし、Dockerチームは後方互換性を壊したくないため、新しいフラグを導入しました。

COPY --chown=<user>:<group> <hostPath> <containerPath>

他の選択肢は次のとおりです。

  1. イメージをビルドする前に、ステージングフォルダーの権限を変更します。
  2. 所有権を変更するブートストラップスクリプトを介してコンテナを実行します。
  3. レイヤーをつぶしてください!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.