web-dev-qa-db-ja.com

Docker所有者のコピーと変更

次の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に設定することです。しかし、これはハッキングのようです。

55

私は解決策を見つけたと思う。データボリュームコンテナを使用すると、このトリックが実行されます。最初に、外部ディレクトリのコピーを含むデータボリュームコンテナを作成します。

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>を使用するだけです。

10

--chownフラグがCOPYに追加されました:

COPY --chown=patrick hostPath containerPath

この新しい構文は、Docker 17.09で動作するようです。

詳細については、 the PR を参照してください。

108

/tmp/を使用して必要なときにいつでもコピーするよりも、ファイルを一時ディレクトリ(たとえば、RUN cp)にコピーします。

COPY myfile /tmp/
RUN cp -r /tmp/myfile /target/path/
0
Ohad Cohen