公式の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
TomcatのDockerfileを表示および変更する方法はおそらくありますが、数分たってもわかりません。私のエレガントな解決策は、chownの前にこの行を追加することです:
USER root
(推奨される)後に特権を降格したい場合は、次の行を追加できます。
USER Tomcat
または、ソフトウェアがインストールされていないイメージを操作して、Dockerfileをrootとして開始し、Tomcatなどをインストールすることもできます。彼らが私の経験から彼らのイメージでそれを変えるのは実際には奇妙です。意図したエンドユーザーが適切と思われるUSERディレクティブを設定できるようにするのは理にかなっています。
Docker 17.09以降、--chown
フラグDockerfileのADD/COPY操作でフラグを使用して、注記のようにイメージのサイズを増やすchownを使用した個別のRUN操作ではなく、ADD/COPYステップ自体の所有者を変更します。これをデフォルトのモード、つまり、ファイルをコピーしているユーザーの権限がコピーされたファイルに適用されるようにすると便利でした。ただし、Dockerチームは下位互換性を壊したくなかったため、新しいフラグを導入しました。
COPY --chown=<user>:<group> <hostPath> <containerPath>
他の選択肢は次のとおりです。