次のDockerfileが与えられた場合
FROM ubuntu
RUN groupadd mygroup
RUN useradd -ms /bin/bash -G mygroup john
MKDIR /data
COPY test/ /data/test data
RUN chown -R john:mygroup /data
CMD /bin/bash
コピーされたテストディレクトリで、ファイルのアクセス許可を770に設定しました。
コンテナ内でsu john
を実行すると、テストディレクトリ内のファイルまたはサブディレクトリにアクセスできません。この問題は、コピーされたディレクトリがまだルートによって所有され、アクセス許可が770に設定されているaufsファイルシステムの所有権に関連しているようです。
許可を正しく設定するためのこの問題の回避策はありますか? 1つは、コピーする前に、元のディレクトリのアクセス許可をコンテナユーザーのuidに設定することです。しかし、これはハッキングのようです。
私は解決策を見つけたと思う。データボリュームコンテナを使用すると、このトリックが実行されます。最初に、外部ディレクトリのコピーを含むデータボリュームコンテナを作成します。
FROM busybox
RUN mkdir /data
VOLUME /data
COPY /test /data/test
CMD /bin/sh
ユーザーがいるアプリケーションコンテナーで、次のようになります。
FROM ubuntu
RUN groupadd mygroup
RUN useradd -ms /bin/bash -G mygroup john
COPY setpermissions.sh /root/setpermissions.sh
CMD /root/setpermissions.sh && /bin/bash
Setpermissionsスクリプトは、ユーザーのアクセス許可を設定するジョブを実行します。
#!/bin/bash
if [ ! -e /data/.bootstrapped ] ; then
chown -R john:mygroup /data
touch /data/.bootstrapped
fi
ここで、アプリケーションコンテナを実行するときに--volumes-from <myDataContainerId>
を使用するだけです。
--chown
フラグがCOPY
に追加されました:
COPY --chown=patrick hostPath containerPath
この新しい構文は、Docker 17.09で動作するようです。
詳細については、 the PR を参照してください。
/tmp/
を使用して必要なときにいつでもコピーするよりも、ファイルを一時ディレクトリ(たとえば、RUN cp
)にコピーします。
COPY myfile /tmp/
RUN cp -r /tmp/myfile /target/path/