web-dev-qa-db-ja.com

ルート権限のないドッカーコンテナーにファイルを追加するにはどうすればよいですか?

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

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

Dockerfileにファイルをそのコンテナにコピーするように指示すると、ファイルには644の権限があり、所有者はrootです。私が理解している限り、Dockerfile内のすべてのコマンドはrootとして実行されるため、これは妥当なようです。ただし、そのファイルの所有権をTomcat:tomcatに変更しようとすると、Operation 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
18
nyi

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

USER root

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

USER Tomcat

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

20

Docker 17.09以降、--chownフラグDockerfileのADD/COPY操作でフラグを使用して、注記のようにイメージのサイズを増やすchownを使用した個別のRUN操作ではなく、ADD/COPYステップ自体の所有者を変更します。これをデフォルトのモード、つまり、ファイルをコピーしているユーザーの権限がコピーされたファイルに適用されるようにすると便利でした。ただし、Dockerチームは下位互換性を壊したくなかったため、新しいフラグを導入しました。

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

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

  1. イメージをビルドする前に、ステージングフォルダーの権限を変更します。
  2. 所有権を変更するbootstrapスクリプトを介してコンテナを実行します。
  3. レイヤーをつぶす!
9
Vinayak Gadkari