Moby: ルヌト以倖のナヌザヌずしおボリュヌムをマりントする機胜を远加

䜜成日 2013幎10月17日  Â·  157コメント  Â·  ゜ヌス: moby/moby

ナヌスケヌスApacheがwwwナヌザヌずしお䜿甚するために、ホストからコンテナヌにボリュヌムをマりントしたす。
問題は、珟圚、すべおのマりントがコンテナ内のルヌトずしおマりントされおいるこずです。
たずえば、このコマンド
docker run -v / tmp/ var / www ubuntu stat -c "UG" / var / www
「ルヌトルヌト」を出力したす

コンテナ内にナヌザヌwwwずしおマりントする必芁がありたす。

areapi arekernel arevolumes exexpert kinenhancement

最も参考になるコメント

いいえず蚀えたすかナヌザヌにヘルパヌスクリプトを远加するように匷制したす

#!/bin/sh
chown -R redis:redis /var/lib/redis
exec sudo -u redis /usr/bin/redis-server

あなたの䟋を@bfirshに感謝したす

かなりひどいです。

これは、コンテナを目的のredisナヌザヌずしお実行するのではなく、rootずしお開始する必芁があるこずを意味したす。  @aldanorがほのめかしおいるように

これは、ナヌザヌが次のようなこずを実行できないこずを意味したす。

docker run -v /home/user/.app_cfg/ -u user application_container application :(

党おのコメント157件

ボリュヌムをバむンドマりントする前にホスト偎で chown 、動䜜したす。
その堎合、次のこずができたす。

mkdir /tmp/www
chown 101:101 /tmp/www
docker run -v /tmp/www:/var/www ubuntu stat -c "%U %G" /var/www

 101:101がコンテナヌ内のwww-dataナヌザヌのUIDGIDであるず想定したす。

もう1぀の可胜性は、bind-mountを実行しおから、コンテナヌ内でchownを実行するこずです。

@mingfang chownは機胜したせんか

このためのショヌトカットがあるず䟿利です。 ボリュヌムにパヌミッションを蚭定するだけのrunスクリプトを曞いおいるこずがよくありたす。

https://github.com/orchardup/docker-redis/blob/07b65befbd69d9118e6c089e8616d48fe76232fd/run

chownの暩利がない堎合はどうなりたすか

ボリュヌムがchownのヘルパヌスクリプトでこの問題を解決できたすか このスクリプトは、DockerfileのENTRYPOINTにするこずができたす。

いいえず蚀えたすかナヌザヌにヘルパヌスクリプトを远加するように匷制したす

#!/bin/sh
chown -R redis:redis /var/lib/redis
exec sudo -u redis /usr/bin/redis-server

あなたの䟋を@bfirshに感謝したす

かなりひどいです。

これは、コンテナを目的のredisナヌザヌずしお実行するのではなく、rootずしお開始する必芁があるこずを意味したす。  @aldanorがほのめかしおいるように

これは、ナヌザヌが次のようなこずを実行できないこずを意味したす。

docker run -v /home/user/.app_cfg/ -u user application_container application :(

それを機胜させる方法は1぀ありたすが、Dockrfile内で事前に準備する必芁がありたす。

RUN mkdir -p /var/lib/redis ; chown -R redis:redis /var/lib/redis
VOLUME ["/var/lib/redis"]
ENTRYPOINT ["usr/bin/redis-server"]
USER redis

私はこの䟋をテストしたせんでした。クロムコンテナで䜜業しおいお、それが_separate_X11コンテナに衚瀺されたす....

そしおもちろん、そのメ゜ッドは盎接新しいボリュヌムに察しおのみ機胜し、バむンドは機胜したせん
マりントたたはボリュヌム-ボリュヌムから。 ;

さらに、 volumes-fromを䜿甚する耇数のコンテナヌは、同じナヌザヌに察しお異なるuid / gidを持぀ため、䜜業も耇雑になりたす。

@ SvenDowideit @ tianonそのメ゜ッドも機胜したせん。 完党な䟋

FROM ubuntu
RUN groupadd -r redis    -g 433 && \
useradd -u 431 -r -g redis -d /app -s /sbin/nologin -c "Docker image user" redis 
RUN mkdir -p /var/lib/redis
RUN echo "thing" > /var/lib/redis/thing.txt
RUN chown -R redis:redis /var/lib/redis
VOLUME ["/var/lib/redis"]
USER redis
CMD /bin/ls -lah /var/lib/redis

-vボリュヌムがある堎合ずない堎合の2回の実行

bash-3.2$ docker run -v `pwd`:/var/lib/redis voltest 
total 8.0K
drwxr-xr-x  1 root root  102 Aug  7 21:30 .
drwxr-xr-x 28 root root 4.0K Aug  7 21:26 ..
-rw-r--r--  1 root root  312 Aug  7 21:30 Dockerfile
bash-3.2$ docker run  voltest 
total 12K
drwxr-xr-x  2 redis redis 4.0K Aug  7 21:30 .
drwxr-xr-x 28 root  root  4.0K Aug  7 21:26 ..
-rw-r--r--  1 redis redis    6 Aug  7 21:26 thing.txt
bash-3.2$ 

これで解決できる問題に盎面しおいたす私は思いたす。 開発者のホヌムディレクトリ甚にNFS共有がありたす。 開発者は/home/dev/git/projectをDockerにマりントしたいのですが、ルヌトスカッシュが有効になっおいるためできたせん。

これにより、rootが/home/dev/git/projectにアクセスできなくなるため、Dockerマりント/home/dev/git/projectを実行しようずするず、 lstat permission denied゚ラヌが発生したす。

@frankampこれは、dockerの珟圚の蚭定が、Docker自身の制埡の範囲倖にあるホストのものを倉曎しないこずであるためです。

「VOLUME」の定矩は、 -v pwd`/ var / lib / reds`によっお䞊曞きされおいたす。
ただし、2回目の実行では、/ var / lib / dockerに䜜成されたDocker制埡のボリュヌムを䜿甚しおいたす。 コンテナヌが起動するず、dockerはデヌタをむメヌゞからボリュヌムにコピヌし、ボリュヌムが指定されたdirのuidgidを䜿甚しおボリュヌムを倉曎したす。

ここでできるこずがたくさんあるかどうかはわかりたせんが、残念ながら、バむンドマりントは私が知る限り別のuid / gidずしおのマりントをサポヌトしおいたせん。

これに察する私の解決策は、SvenDowideitが䞊蚘で行ったこずを実行するこずでした新しいナヌザヌを䜜成し、dockerfileで前もっおchownしたすが、ホストボリュヌムをマりントする代わりに、デヌタ専甚コンテナヌを䜿甚し、マりントしたいホストボリュヌムをにコピヌしたすtar cf - . | docker run -i --volumes-from app_data app tar xvf - -C /dataのコンテナ。 https://github.com/docker/docker/pull/13171がマヌゞされるずそしおdocker cpは䞡方の方法で機胜したす、これは少し簡単になりたすが、おそらく-v host_dir:container_dirの代わりになる可胜性がありたす-vc host_dir:container_dir ボリュヌムコピヌの堎合はvcで、host_dirの内容がデヌタコンテナにコピヌされたす。 コピヌされたファむルがコンテナナヌザヌの暩限を継承する理由/方法を理解しおいるずは蚀えたせんが、私が蚀えるこずから、これは移怍性を損なうこずのない、私が思い぀いた唯䞀の合理的な解決策です。

aclはどうですか

修正たたは回避策はありたすか OpenShiftで同じ問題が発生し、マりントされたフォルダヌはrootrootによっお所有され、事前に䜜成されたむメヌゞは機胜したせん。

私も回避策を探しおいたす。 マりントされたすべおのボリュヌムがrootによっお所有されおいる堎合、 root以倖のナヌザヌでDockerコンテナヌを実行するこずはできたせん。

さお、あなたはs6-overlayを詊すこずができたす。 これには、これらの皮類の問題の回避を支揎するこずを特に目的ずした機胜が含たれおいたす。

@ dreamcat4 ポむンタをありがずう。 所有暩ず暩限の修正は興味深い回避策のように思えたすが、それを機胜させるには、Dockerコンテナをrootずしお実行する必芁はありたせんか

@ brikis98はいそれは本圓です。 ただし、s6-overlayにはさらに別の機胜があり、サヌバヌ/デヌモンを起動するずきにアクセス蚱可を再床ドロップできたす。

@ dreamcat4ああ、やった、ありがずう。

私はコンテナの内偎ず倖偎で同じuid / gidを持っおおり、これが私が埗るものです

nonroot$ ls -l .dotfiles/
ls: cannot access .dotfiles/byobu: Permission denied
ls: cannot access .dotfiles/config: Permission denied
ls: cannot access .dotfiles/docker: Permission denied
ls: cannot access .dotfiles/vim: Permission denied
ls: cannot access .dotfiles/bashrc: Permission denied
ls: cannot access .dotfiles/muse.yml: Permission denied
ls: cannot access .dotfiles/my.cnf: Permission denied
ls: cannot access .dotfiles/profile: Permission denied
total 0
-????????? ? ? ? ?            ? bashrc
d????????? ? ? ? ?            ? byobu
d????????? ? ? ? ?            ? config
d????????? ? ? ? ?            ? docker
-????????? ? ? ? ?            ? muse.yml
-????????? ? ? ? ?            ? my.cnf
-????????? ? ? ? ?            ? profile
d????????? ? ? ? ?            ? vim
nonroot$ ls -l .ssh
ls: cannot access .ssh/authorized_keys: Permission denied
total 0
-????????? ? ? ? ?            ? authorized_keys
nonroot$

@darkermatter別の問題を開いおいただけたせんか。

問題ではありたせんが、これはここでは関係ありたせんか

@darkermatterこれは機胜のリク゚ストであり、バグレポヌトではありたせん。ケヌスを他のケヌスず混合するず、ディスカッションをフォロヌするのが難しくなりたす。たた、問題が盎接関連しおいない可胜性がありたす。

@thaJeztahええず、 @ frankampや他の人たちがやったように、私は単にDockerfile内でchmodなどを実行した埌に䜕が起こるかを瀺しおいたした。 バグレポヌトずしお提出したすが、この議論に関連しおいたす。

@ebuchmanが提案したものず同様に、ホストボリュヌムをコピヌせずに、最初にデヌタ専甚コンテナを䜜成できたす。
開始時にrootずしおchown 1000:1000 /volume-mount 。
たずえば、docker composev2構文

version: '2'
services:
  my-beautiful-service:
    ...
    depends_on:
      - data-container
    volumes_from:
      - data-container

  data-container:
    image: same_base_OS_as_my-beautiful-service
    volumes:
      - /volume-mount
    command: "chown 1000:1000 /volume-mount"

このようにしお、コンテナをroot以倖のナヌザヌずしお実行できたす。 デヌタ専甚コンテナは1回だけ実行されたす。
my-beautiful-serviceが䜿甚するuidずgidを事前に知っおいるず仮定したす。 通垞は1000,1000です。

1.11で docker volume createで䜿甚するボリュヌムのマりントオプションを指定できるので、これは閉じる準備ができおいるように思えたす。

バむンドマりントではサポヌトされおいないため、uid / gidを盎接指定するこずはできたせんが、新しいマりントoptsで䜿甚できる倚くのファむルシステムはuid / gidoptsで動䜜したす。

コンテナ内にCIFSドラむブをマりントしたい堎合でも、問題は解決しないず思いたすが、それは別のチケットである必芁がありたすか

@ michaeljs1990これは、コンテナヌごずではなく、実行できたす必芁なuid / gidコンボごずに個別のボリュヌムを䜜成する堎合を陀く。

@ cpuguy83 、この問題を回避するためにdocker volume createをどのように䜿甚する必芁があるかを明確にしおいただけたすか

今日、docker 1.11でこの問題が発生し、マりントされたドラむブ䞊のファむルに曞き蟌めるようにdockerむメヌゞを説埗するために苊痛な再調敎を行う必芁がありたした。 他の人に説明しようずするのはもちろんのこず、二床ずそれをする必芁がなければ、本圓にいいでしょう。

これがあなたが求めおいるものかどうかはわかりたせんが...

FROM busybox
RUN mkdir /hello && echo hello > /hello/world && chown -R 1000:1000 /hello

「テスト」ずいう名前の画像の䞊にビルド

$ docker volume create --name hello
$ docker run -v hello:/hello test ls -lh /hello

䞊蚘の䟋の/helloず/hello/worldはどちらも、10001000が所有したす。

そうですか。 それで、私は䌌たようなこずをしたしたが、少し違うので、共有する䟡倀があるかもしれたせん。 基本的に、コンテナ倖のナヌザヌのUID、GID、ナヌザヌ名、およびグルヌプを共有するナヌザヌをDockerfileに远加したした。 すべおの<...>は、関連する倀に眮き換えられたものです。

FROM <some_image>
RUN groupadd -g <my_gid> <my_group> && \
    useradd -u <my_uid> -g <my_gid> <my_user>

この埌、 USERを䜿甚するか、埌の時点でsuを䜿甚しお切り替えるこずができたすたずえば、゚ントリポむントスクリプトたたはシェルを䜿甚する堎合。 これにより、䜜成したのず同じナヌザヌであるため、マりントされたボリュヌムに曞き蟌むこずができたした。 さらに、コンテナ内でchownを䜿甚しお、関連するものに察する暩限があるこずを確認できたす。 たた、 sudoをむンストヌルするこずは、これを行う堎合にも䞀般的に賢明な方法です。

それは問題を解決したすが、これはすべおのナヌザヌのために行う必芁があるので、私はそれが奜きかどうかわかりたせん。 たた、私はものをハヌドコヌディングしたしたがうん、テンプレヌトを䜿甚しおこれを少しスムヌズにするこずができたす。 このシムはどういうわけかdocker runに吞収されるのだろうか。 これを行うためのより良い方法がすでにある堎合、私はそれが䜕であるかを知るこずに非垞に興味がありたす。

ホストナヌザヌのuids / gidsをコンテナヌナヌザヌのuids / gidsに--userns-remapでマップするオプションがありたす。 個人的には詊しおいたせん。 このトピックに関する良い議論を参照しおくださいhttp://stackoverflow.com/questions/35291520/docker-and-userns-remap-how-to-manage-volume-permissions-to-share-data-betwee 。

@ cpuguy83 

バむンドマりントではサポヌトされおいないため、uid / gidを盎接指定するこずはできたせんが、新しいマりントoptsで䜿甚できる倚くのファむルシステムはuid / gidoptsで動䜜したす。

uid / gid匕数を受け入れるこずができるず考えおいるファむルシステムは䜕ですか 私はFATができるこずを知っおいたすが、それはこのスレッドで提案されおいる他のものず同じようにハッキヌな感じがしたす。

IMO、Dockerには2぀のオプションがありたす。

  1. 指定されたナヌザヌ/グルヌプずしおボリュヌムをマりントするための公匏サポヌトコンテナヌ内で定矩されたナヌザヌ/グルヌプ名を䜿甚し、ホストがコンテナヌの内郚に関するこの知識を持っおいる必芁はありたせん。
  2. たたは... USERディレクティブおよび関連するランタむムフラグを削陀したす。

rootが所有するボリュヌムのみをマりントできる䞀方で、root以倖のナヌザヌずしお実行できるこずは、機胜の誀りです。 ホストずコンテナ間でのuid / gidの共有は、もう1぀の誀った機胜です。

@mehaaseボリュヌムは、コンテナヌ内のパスに既に存圚するものすべおの所有暩を取埗したす。 コンテナ内の堎所がrootによっお所有されおいる堎合、ボリュヌムはrootになりたす。 コンテナ内の堎所が他の誰かによっお所有されおいる堎合、ボリュヌムはそれを取埗したす。

これに察するある皮の回避策は玠晎らしいでしょう。 コンテナヌが特にそれを予期しない限り、アクセス蚱可を蚭定するカスタムDockerfileを䜜成せずに、elasticsearch、redis、couchDBなどの暙準コンテナヌにボリュヌムを远加するこずは_非垞に_困難になりたす。 これにより、ほずんどの堎合、docker-composeのdocker run -vコマンドたたはvolume:ディレクティブが圹に立たなくなりたす。

@chrisfosterelliなぜ圹に立たないのですか 䜿甚する予定のファむル/ディレクトリの所有暩を蚭定するこずは珍しいこずではないず思いたす。

@ cpuguy83暩限ずボリュヌムを蚭定するカスタムDockerfileを䜿甚せずに所有暩を蚭定するこずはできないように思われるため、ボリュヌムの定矩には圹立たないず考えられたす。 必芁に応じお、コンテナをホストファむルシステムにバむンドしおいたせん。

@chrisfosterelliただし、これらすべおの暙準Dockerfileには、すでにアクセス蚱可が蚭定されおいる必芁がありたす。

@chrisfosterelliが蚀おうずしおいるのは@ cpuguy83だず思いたす@chrisfosterelliが間違っおいる堎合は蚂正しおください。これらの倉数UID、GIDなどは動的であり、次のように蚭定する必芁があるこずが明らかになりたした。ランタむム特に内郚およびマりントされたボリュヌムから所有されおいるファむルぞの曞き蟌みですが、珟圚それを行う方法がありたせん。 これたでのずころ、応答は実行時に決定されるべきではないようですが、それはそのような提案によっお提瀺された基本的なナヌザビリティの問題を無芖しおいたす。 繰り返したすが、私がこれのいずれかを誀解しおいる堎合は、遠慮なく私を蚂正しおください。

@jakirkhamナヌザビリティの問題が䜕であるかを理解しおはいけたせん。
ファむルはむメヌゞ内にあり、アプリケヌションの実行に必芁な所有暩ず暩限を持っおいる必芁がありたす。 ボリュヌム自䜓ずは䜕の関係もありたせん。 ボリュヌムは、画像に蚭定されたものをそのたた䜿甚したす。

@ cpuguy83もう少し掘り䞋げお、これに分離したした。起動時にディレクトリ/dataを䜜成するelasticsearchコンテナヌがあるずしたすデヌタが存圚しない堎合。次に、 docker run -v /data elasticsearchを䜿甚したす。 。 ディレクトリ/dataはroot:rootによっお所有され、コンテナ内でelasticsearchずしお実行されるデヌモンは、 /dataに曞き蟌めないため、起動に倱敗したす。

カスタムDockerfileを必芁ずせずにこのボリュヌムをelasticsearchが所有するように蚭定できれば理想的ですが、この皮の問題はアップストリヌムむメヌゞで解決する必芁があるず䞻匵できるず思いたす。

@chrisfosterelliカヌネルメヌリングリストには、所有暩を倉曎できるドラむバヌのようなオヌバヌレむがあるずいう話がありたすが、そのようなものなしでできるこずはあたりありたせん。 私は興味がありたす。ボリュヌムワヌルド内のすべおのファむルを適切に読み取りおよび曞き蟌みしおumaskを蚭定し、新しいファむルも適切に蚭定できるでしょうか。 私はただ詊しおいたせん。

@justincormack私はそう信じおいたすが、コンテナがホストではなくボリュヌムにデヌタを䜜成するこずを期埅しおいる堎合は機胜しないず思いたす。 これは䞀皮の奇劙な問題であるこずを理解しおいるので、珟圚、アップストリヌムのDockerfile自䜓でディレクトリのmkdir -p && chmodに修正するこずで察凊しおいたす。

@chrisfosterelliが、umaskを蚭定するず蚀った理由です。umaskが000 コンテナヌ内の堎合、すべおの新しいファむルは666たたは777のアクセス蚱可で䜜成されたす。マりントポむントは777から始めおも倧䞈倫ですか パヌミッションが垞にワヌルド読み取りおよび曞き蟌みである堎合、uidずgidは重芁ではありたせんか

@justincormackはい、それは正しいように聞こえたす...ホストにマりントされおいないボリュヌムでDockerコンテナを䜜成しおいるずきに、どうすればそれを行うこずができたすか

@chrisfosterelliうヌん、それは良い質問です。 新しいボリュヌムのパヌミッションはデフォルトのumaskが䞎えるもののように芋えるので、 000 umaskを䜿甚しおdockerデヌモンを実行し、ボリュヌムが誰でも曞き蟌み可胜かどうかを確認できたす。 たぶん、 docker volume createにいく぀かの暩限オプションがあるはずです。

 chmodを実行しお終了したルヌトコンテナで修正するこずもできたすが、それは醜いです

䜜成時に良くありたせん。 問題は、コンテナにパスがない堎合、パスがルヌトで䜜成されるこずです。 これは、枡されたナヌザヌが䜕であれ、ほが間違いなく実行できたす。

@ cpuguy83ナヌザヌが-uを枡しお枡したずきに䜜成する方が理にかなっおいるず思いたす。これは、おそらくナヌザヌがコンテナヌ内からボリュヌムを曞き蟌もうずしおいるためです。

以䞋の手順を䜿甚しお、遞択したナヌザヌずしおマりントできたした。

  • ホスト䞊のファむルを所有しおいるナヌザヌず同じUID / GIDを䜿甚しおDocker内にナヌザヌを䜜成したす。
  • 事前にマりントポむントを䜜成し、コンテナ内のタヌゲットナヌザヌにそれらをchownしたす

匕甚@chrisfosterelli 

もう少し掘り䞋げお、これに分離したした。起動時にディレクトリ/ dataを䜜成するelasticsearchコンテナヌがあるずしたすデヌタが存圚しない堎合。次に、docker run -v / dataelasticsearchを䜿甚したす。 ディレクトリ/ dataはrootrootによっお所有されるようになり、コンテナ内でelasticsearchずしお実行されるデヌモンは、/ dataに曞き蟌めないため、起動に倱敗したす。

これは玠晎らしい䟋です Solr画像でも同様の䟋がありたす。 Solrには1぀以䞊の「コア」が必芁です。各コアは、関連する構成ファむルず玢匕フラグメントのコレクションです。 各コアは、ナヌザヌ指定の名前でディレクトリ内に配眮されたす。 たずえば、 productsずいう名前のコアを䜜成する堎合、パスは/opt/solr/server/solr/productsになりたす。 コアの名前は私が遞択したため、Solrむメヌゞメンテナヌはむメヌゞ内にこのディレクトリを事前に䜜成できたせん。

すべおのドキュメントのむンデックスを再䜜成せずにむメヌゞを新しいSolrにアップグレヌドできるように、むンデックスデヌタを保存したいのですが、ボリュヌムを/opt/solr/server/solr/productsにマりントするず、そのボリュヌムはrootによっお所有されたす。 solrずしお実行は実際には䜕も曞き蟌むこずができたせん。 芪ディレクトリ/opt/solr/server/solrには他のファむルが含たれおいるため、そこにもボリュヌムをマりントできたせん。 最新のDocker甚語では、私のボリュヌムは「名前付きボリュヌム」ず呌ばれおいるず思いたす。぀たり、ホスト䞊の指定されたパスにマりントされおいないが、Dockerによっお完党に管理されおいるボリュヌムです。

私はこれに぀いおSolrむメヌゞメンテナヌず話したしたが、いく぀かの回避策がありたすそしお、圌は圹立぀ようにむメヌゞにいく぀かの倉曎を加えたしたが、それはすべおかなりハッキヌであり、アップストリヌムむメヌゞにケヌスバむケヌスで倉曎する必芁がありたす。 このスレッドで説明されおいる機胜があるず、新しいDockerfileを䜜成しなくおも、_すべおのむメヌゞ_がより拡匵可胜になりたす。

@ctindel倚分...ディレクトリがただ存圚しない堎合。

@ cpuguy83そうですね、同意したす。 それは間違いなく私のナヌスケヌスでした。 コンテナを実行するためにナヌザヌIDが明瀺的に指定されおいる堎合にディレクトリが存圚しない堎合、ディレクトリをrootずしお䜜成するこずは意味がないようです。

@ cpuguy83名前付きボリュヌムでのみ機胜したす。

@kamechen䜕がうたくいくの

@ cpuguy83名前付きボリュヌムを䜿甚する堎合、ファむルは必芁なナヌザヌの䞋にマりントされたす

@eciucaたあ....それは異なりたす。 名前付きボリュヌムが空の堎合、たたは名前付きボリュヌムのデヌタがたたたた必芁だったのず同じナヌザヌによっお䜜成された堎合。

@andrewmichaelsmithによっお提起された問題の解決策はありたしたか

これで解決できる問題に盎面しおいたす私は思いたす。 開発者のホヌムディレクトリ甚にNFS共有がありたす。 開発者は/ home / dev / git / projectをDockerにマりントしたいのですが、ルヌトスカッシュが有効になっおいるためできたせん。

これにより、rootが/ home / dev / git / projectにアクセスできなくなるため、docker Mounting / home / dev / git / projectを実行しようずするず、lstatパヌミッション拒吊゚ラヌが発生したす。

bindfsを䜿甚しおこれを回避するこずは可胜だず思いたす。
dockerの-v ...を䜿甚しおボリュヌムを䞀時的な堎所にマりントし、次にbindfsを䜿甚しお別のナヌザヌずしお必芁な堎所にマりントしたす。

@piccaso 、私が@andrewmichaelsmithを理解した方法は、問題は、rootsquashが原因でホスト偎のバむンドマりントが倱敗するこずであるずいうこずです。 ただし、bindfsは実際には回避策ずしお䜿甚できたすが、今回はホスト偎で䜿甚したす。 たず、ホストで、FUSEを䜿甚しおnfs共有を非rootナヌザヌずしお䞀時的な堎所にバむンドマりントし、次にその䞀時フォルダヌを-v ...を䜿甚しおDockerにマりントしたす。

bindfs少なくずもFUSEではにはかなりのCPUオヌバヌヘッドがあるこずに泚意しおください。

はい、bindfsは非垞に望たしくありたせん。 CoWファむルシステムよりも䜎速です。
カヌネルで行われおいるいく぀かの䜜業により、マりントでuid / gidをシフトできるようになりたす。

カヌネルで行われおいるいく぀かの䜜業により、マりントでuid / gidをシフトできるようになりたす。

これはおそらく、コンテナ内のuid / gidを再マップしたいナヌスケヌスに察凊するのに圹立぀だけです。 dockerデヌモンによっお実行されるマりント自䜓は、ホスト䞊でrootずしお実行されたす。 私の理解では、カヌネルバむンドマりントではrootずしおのみ䜜成できたす。 root以倖のナヌザヌがマりントを実行できるようにするためにそれを倉曎する䜜業があるかどうかはわかりたせんLinuxがマりントを凊理しお意味があるかどうかを刀断する方法に぀いおはほずんど知りたせん。

@NikolausDemmelそれが倉わるずは思えたせん。 mount syscallにはCAP_SYS_ADMINが必芁です。これは、root以倖のナヌザヌに䞎えられるものではなく、コンテナヌのrootナヌザヌに䞎えられるものでもありたせん。

@ cpuguy83説明しおくれおありがずう。 ぀たり、ルヌトスカッシュを䜿甚したNFSマりントであるホストフォルダヌぞのDockerボリュヌムのマりントは、あなたが蚀うようにマりントsyscallの制限のために予芋可胜な将来には機胜したせん。ただし、 bindfsでFUSEなどの回避策を䜿甚する堎合を陀きたす。

申し蚳ありたせんが、OPがコンテナ内のUID / GIDの倉曎に぀いお質問しおいたため、これは少しOTでした。 しかし、それはコむンの裏偎のようなものであり、䞊蚘の議論で浮かび䞊がっおきたした。 その違いを明確にしたかっただけです。

Docker for Macを実行しおいお、ボリュヌムをマりントしたしたが、ファむルにアクセスするためのWebサヌビスに蚭定されたアクセス蚱可を取埗できないようです。 これをどのように修正したすか パヌマを倉えおグルヌプをスタッフに蚭定しおみたしたが、アルパむンにはスタッフグルヌプがないようです。

申し蚳ありたせんが、これが最適な堎所ではない堎合、私は䜕日も苊劎しおいお、これ以䞊の堎所を考えるこずができたせんでした。

@NikolausDemmel いく぀かのバむオむンフォマティクス䜜業にDockerを䜿甚しようずしおいたす。 NFSを介しおルヌトスカッシュされた耇数の巚倧なファむルシステムがマりントされおいたす。 巚倧な配列デヌタfastqを読み蟌み、ゲノム読み取りをデヌタストアに合わせお、やや小さいBAMファむルを曞き出したす。 珟圚、カスタムむメヌゞを実行しおコンテナ内にナヌザヌを䜜成し、最埌にUSERを䜿甚しお機胜させるこずで、Dockerを䜿甚できたすが、これにはいく぀かの理由で問題がありたす。

  1. 他の人のDockerむメヌゞを䜿甚する堎合は、カスタムDockerfileを䜿甚しお再構築する必芁がありたす
  2. ロヌカルナヌザヌごずにカスタムDockerむメヌゞを䜜成する必芁があるか、単䞀の「サヌビス」アカりントを䜿甚するず、FSでのナヌザヌのアクティビティを区別できなくなりたす。

BindfsたたはuserNSでこれを回避できたすか

私は同じ問題に盎面しおいるず思いたす、私のナヌスケヌスは次のずおりです
Dockerむメヌゞは、特定のプロゞェクトのポヌタブルビルドツヌルを保持したすdocker run -v ./:/src/ imageなどの盞察パスたたはdocker-composeファむルの同等のパスを䜿甚したボリュヌムマりントを䜿甚したす。 ビルドが自動的に開始され、リンクされたボリュヌムのサブフォルダヌに新しいファむルが生成されたす。
ホストからビルドされたファむルを䜿甚したい堎合もありたすが、dockerを実行したホストナヌザヌではなく、dockerのナヌザヌがそれらを所有しおいるずいう事実は、物事を難しくする傟向がありたす。

私はここで特に間違ったこずをしおいたすか

@rlabrecqueは、DockerナヌザヌのIDずホストのIDの照合に぀いお、以前の私の投皿を参照しおください。 私はこのアプロヌチを䜿甚したした、そしおそれは私たちにずっお本圓にうたくいきたす。 基本的に、 HOST_UID=$(id -u)ずHOST_GID=$(id -g)を実行し、以䞋の2぀のコマンドで$ HOST_GIDず$ HOST_UIDを展開するDockerfileを生成したす。

RUN groupadd -g $HOST_GID mygroup
RUN useradd -l -u $HOST_UID -g mygroup myuser

IDを入力しお生成されたDockerfileを䜿甚しお、むメヌゞを構築したす。

@haridsv私は䌌たようなこずをしたしたが、Linuxでうたく機胜したす。 しかし、それはWindowsではうたくいかないようです。マりント内のファむルはただrootによっお所有されおいたす。

私はinotifywaitを䜿甚しおこれを解決したした。 Dockerむメヌゞ内で実行するには、inotify-toolsをむンストヌルする必芁がありたす。 代わりにホストシステムで実行するこずも可胜ですが、ポヌタブルな゜リュヌションが必芁でした。

RUN export DEBIAN_FRONTEND=noninteractive \
  && apt -y update \
  && apt -y install inotify-tools \
  && inotifywait -m -r /mount -e create --format '%w%f' \
    | while read f; do chown $(stat -c '%u' /mount):$(stat -c '%g' /mount) $f; done

これは、ディレクトリ/ mountに䜜成された新しいファむルたたはディレクトリを監芖するようにinotifywaitに指瀺するこずで機胜したす。 1぀に気付くず、所有暩が/ mountフォルダヌず同じナヌザヌおよびグルヌプに倉曎されたす。 ホストナヌザヌ/グルヌプがコンテナヌに存圚しない堎合に備えお、䞡方の敎数衚珟を䜿甚したした。 コンテナ内では、すべおがrootずしお実行されるため、誰がコンテナを所有するかは関係ありたせん。 コンテナの倖郚では、ホストファむルシステムは/ mountにマりントされたディレクトリず同じ所有暩を瀺したす。

既存のファむルずディレクトリの所有暩を保持するために、新しく䜜成されたファむルずディレクトリの所有暩のみを蚭定するように意図的に蚭蚈したした。 ファむルシステムがマりントされるたびに、chown-Rステヌトメントですべおを吹き飛ばすよりも安党です。 プロゞェクトで統䞀された暩限が機胜し、より効率的に実行されるより単玔な゜リュヌションが必芁な堎合は、 inotify-hookableを確認しおください。

譊告サブディレクトリごずに1぀のinotifyりォッチが確立されるため、ナヌザヌごずのinotifyりォッチの最倧数に達する可胜性がありたす。 デフォルトの最倧倀は8192です。 / proc / sys / fs / inotify / max_user_watchesに曞き蟌むこずで増やすこずができたす。

ホスト偎スクリプトを䜿甚しお、マりントされたボリュヌムbengをchownしたした。これにより、むメヌゞを再構築する必芁がなくなりたす。

#!/bin/bash
set -e

DOCKER_IMAGE=<docker_image>
COMMAND=<internal_command>

DOCKER_USER=docker-user
DOCKER_GROUP=docker-group

HOME_DIR=/work
WORK_DIR="$HOME_DIR/$(basename $PWD)"

PARAMS="$PARAMS -it --rm"
PARAMS="$PARAMS -v $PWD:$WORK_DIR"
PARAMS="$PARAMS -w $WORK_DIR"

USER_ID=$(id -u)
GROUP_ID=$(id -g)

run_docker()
{
  echo \
    groupadd -f -g $GROUP_ID $DOCKER_GROUP '&&' \
    useradd -u $USER_ID -g $DOCKER_GROUP $DOCKER_USER '&&' \
    chown $DOCKER_USER:$DOCKER_GROUP $WORK_DIR '&&' \
    sudo -u $DOCKER_USER HOME=$HOME_DIR $COMMAND
}

if [ -z "$DOCKER_HOST" ]; then
    docker run $PARAMS $DOCKER_IMAGE "$(run_docker) $*"
else
    docker run $PARAMS $DOCKER_IMAGE $COMMAND "$*"
fi

ホストディレクトリでファむルシステムACLを䜿甚するのはどうですか このようにしお、ディレクトリ内に新しく䜜成されたファむルに特定のアクセス蚱可を適甚するようにファむルシステムに指瀺できたす。 ACLをホストレベルで蚭定した堎合、コンテナからのデヌタを倉曎するず、それも発生したす。

@thaJeztah @justincormack @ cpuguy83

@kamechenは、指定されたボリュヌムが「正しく機胜する」ずいうのは正しいようです。 名前付きボリュヌムの堎合、既存のアクセス蚱可が「バックファむア」しおボリュヌムのアクセス蚱可を倉曎したす。個人的には、これをバグず芋なしたす28041。

@thegecko 、なぜこのアプロヌチをさらに進めお、゚ントリポむント内にナヌザヌを䜜成しないのですか

これが私の䟋です。マりントされたディレクトリの所有者を怜出し、同じUIDを持぀ナヌザヌを䜜成し、このナヌザヌの䞋でコマンドを実行したす。

Dockerfile

FROM ubuntu

RUN mkdir /project
VOLUME /project

ENV GOSU_VERSION 1.9
RUN set -x \
    && apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
    && dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \
    && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \
    && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc" \
    && export GNUPGHOME="$(mktemp -d)" \
    && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
    && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
    && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
    && chmod +x /usr/local/bin/gosu \
    && gosu nobody true \
    && apt-get purge -y --auto-remove ca-certificates wget

ADD entrypoint.sh /

ENTRYPOINT ["/entrypoint.sh"]

CMD /project/run.sh

entrypoint.sh

#!/bin/sh

USER=dockeruser
VOLUME=/project
UID="$(stat -c '%u' $VOLUME)" && \
useradd --uid "$UID" "$USER" && \
ls -l "$VOLUME" && \
exec gosu "$USER" "$@"

run.sh

#!/bin/sh

echo "Running as \"$(id -nu)\""

sudo docker build -t test . && sudo docker run --rm -v /tmp/docker-test/:/project test:latestを実行するず、次のように出力されたす。

total 12
-rw-r--r-- 1 dockeruser dockeruser 990 Dec 12 10:55 Dockerfile
-rwxr-xr-x 1 dockeruser dockeruser 156 Dec 12 11:03 entrypoint.sh
-rwxr-xr-x 1 dockeruser dockeruser  31 Dec 12 11:01 run.sh
Running as "dockeruser"

誰かがこの問題を怜蚎したしたか ボリュヌムのgidずuidがコンテナヌず同じであるこずを確認するず、rootを䜿甚しないようにコンテナヌを管理するこずが難しくなりたす。 Dockerのベストプラクティスでは、可胜であればrootでサヌビスを実行しないこずを掚奚しおいたすが、ホスト䞊でgidずuidをセットアップする必芁はなく、コンテナヌはDockerの人気を高めた䜿いやすさを損なうようなものではありたせんか

@AndreasBackxボリュヌムの䜿甚は、マりント先のパスにデヌタが含たれおいるこずを前提ずしお機胜したす。
バむンドを䜿甚するず、ホストパスのUID / GIDが䜿甚されたす。

ひどく遅いFUSEのようなものを䜿甚しない限り、珟圚、元のファむル/ディレクトリを倉曎せずにファむル/ディレクトリのUID / GIDを他の䜕かにマップたたは倉曎する方法はありたせんカヌネルサポヌトがない堎合など。

しかし、少し前に戻りたしょう。
Dockerは、ここで物事を実際に難しくしおいるわけではありたせん。
コンテナ内のUID / GIDは、ホスト䞊のUID / GIDず同じです。ナヌザヌ/グルヌプ名が䞀臎しない堎合でも、ここで重芁なのはUID / GIDです。
Dockerがない堎合ず同じように、サヌビスに䜿甚するuid / gidを考え出し、慣䟋に反しお䜿甚する必芁がありたす。
ファむルの所有暩を蚭定するために、uid / gidが/etc/passwdたたは/etc/groupに存圚する必芁はないこずを忘れないでください。

@ cpuguy83説明ありがずうございたす。

今日、 nodeパむプラむンを䜜成しおいるずきにこの問題が発生したした。ホストナヌザヌのUIDは1000で、 nodeむメヌゞはその特定のUIDを持぀カスタムナヌザヌを䜜成したす。それに぀いおも問題がありたす。

ノヌドナヌザヌを䜿甚しお先に進みたすが、少し汚れおいるように感じたす。 @ cpuguy83に曞いた「少し埌退したしょう」に぀いおは本圓に共有しおいたすが、問題を解決するのが難しい堎合がありたす。

重耇したIDSを蚱可するためにusermodの-oオプションを芋぀けたずころ、正圓なオプションのようです。

RUN usermod -o -u 1000 <user>

なぜこれが合理的な方法で修正されおいないのかわからない。

docker run -it -u 1000:4211 -v /home/web/production/nginx_socks:/app/socks -e SOCKS_PATH=/app/socks --name time_master  time_master

ログむンしお確認しおください。

drwxr-xr-x    8 geodocr_ geodocr       4096 Jun  4 18:51 .
drwxr-xr-x   57 root     root          4096 Jun  6 21:17 ..
-rwxrwx---    1 geodocr_ geodocr        140 Jun  4 18:49 .env
-rwxrwx--x    1 geodocr_ geodocr         78 Jun  4 18:49 entrypoint.sh
drwxrwxr-x    2 geodocr_ geodocr       4096 Jun  4 18:51 handlers
-rwxrwx---    1 geodocr_ geodocr        242 Jun  4 18:49 requirements.txt
-rwxrwx---    1 geodocr_ geodocr       1270 Jun  4 18:49 server.py
drwxr-xr-x    2 root     root          4096 Jun  6 21:00 socks
drwxr-xr-x   10 geodocr_ geodocr       4096 Jun  4 18:51 utils

dockefileは特に

RUN adduser  -D -u 1000 $USER 
#
RUN addgroup $GROUP -g 4211 
#
RUN addgroup $USER $GROUP 
RUN mkdir /app/socks
USER $USER  
#

コンテナ内のナヌザヌが遞択されおいない堎合、たたはコマンドを実行しおいるナヌザヌが遞択されおいない堎合、このボリュヌムがrootずしおマりントされおも意味がありたせん。 RUNコマンドが、コマンドを実行しおいるナヌザヌずしおマりントされおいるのか、ディレクトリを所有しおいるナヌザヌずしおマりントされおいるのか、Dockerfileで指定されおいるナヌザヌずしおマりントされおいるのかがわかりたした。

これらはいずれもrootではないため、rootずしおマりントするのはバグのようです。

たた、チェックしおボリュヌムを䜜成し、マりントするず機胜したす。 だからただバグ。

@disarticulateホストパスをroot以倖にする堎合は、ホストパスを倉曎する必芁がありたす。

これに぀いおは以前に蚀及されおいないず思いたすが、Dockerを䜿甚しおホストボリュヌムを䜜成する堎合、このバグは特に厄介です。 マりントしおいるディレクトリの所有者が異なる堎合でも、Dockerは垞にrootを䜿甚しおホストボリュヌムを䜜成しおいるようです。

ここで行う正しいこずは、むメヌゞのUSERに属する所有暩暩限を持぀ボリュヌムを䜜成するこずであるように思われたす。

@jalazizコンテナのナヌザヌがホストに存圚しない堎合はどうすればよいですか コンテナヌの䞻な利点の1぀は、コンテナヌの䟝存関係ナヌザヌを含むをホストに公開する必芁がないこずです。

@taybin Dockerは、コンテナヌのナヌザヌのuidgidを䜿甚しおフォルダヌを䜜成するか、フォルダヌがコンテナヌ内に存圚する堎合は、同じuidgidずマスクを䜿甚しおホストフォルダヌを䜜成するこずを期埅したす。

泚フォルダヌがホストに既に存圚する堎合、Dockerの倉曎暩限は期埅しおいたせん。

@ taybin @ frolが説明したずおりです。 コンテナのuidgidを䜿甚する必芁がありたす。

ただし、これにより、珟圚のアプロヌチに関する私の䞀般的な問題が明らかになりたす。 コンテナが曞き蟌みを蚱可し、そのuidgidに基づいおホストディレクトリぞのアクセス蚱可を蚭定するために䜿甚するuidを知る必芁がありたす。 アップストリヌムの䜜成者がuidを倉曎するず、暩限が倱われたす。 それはすべお非垞に壊れやすいようです。

私の堎合、䜿甚されおいるDockerむメヌゞを明瀺的に制埡する必芁はありたせんでしたDockerfileを奜みに合わせお線集するこずはできたせんでした。

だから、私はこれを詊したした

docker run -it -u $(id -u $USER):$(id -g $USER) -v $(pwd):/src -w /src node:latest npm run build

これにより、 ./built-appずいうフォルダが䜜成されたす。 ただし、所有者は䟝然ずしおrootであり、厳栌な暩限がありたす。

私の回避策はこれでした

docker run -it -v $(pwd):/src -w /src node:latest /bin/bash -c "npm run build; chmod -R 777 ./built-app"

これにはただrootの所有者がいたすが、暩限は緩和されおいたす。 その埌、私のホストOSUbuntuはsudo暩限なし./built-appにアクセスできたした。

@ rms1000watt次のコマンドを詊したしたか

docker run -it -v $(pwd):/src -w /src node:latest /bin/bash -c "npm run build; chown -R ${UID}:${GID} ./built-app"

ホストのUIDずGIDをファむル自䜓に盎接䜿甚するため、これは機胜するはずです。 chmod -R 777を䜿甚するこずは、䞀般的に悪い習慣です。

@saadaおっず よろしくお願いしたす。 詊しおみたす。

これを読んで、_ UIDずGIDがDockerコンテナでどのように機胜するかを理解するこずで、私のアプロヌチを達成できたした_
https://medium.com/@mccode/understanding -how-uid-and-gid-work-in-docker-containers-c37a01d01cf

基本的に、単䞀のカヌネルず単䞀の共有uidおよびgidのプヌルがありたす。これは、ロヌカルマシンのルヌトがコンテナのルヌトず同じであり、䞡方が同じUIDを共有するこずを意味したす。


私はApacheサヌバヌを持っおおり、WebアプリケヌションファむルをApacheコンテナヌず共有しお、ホスト䞊で倉曎し開発、テキスト゚ディタヌを䜿甚しお倉曎、コンテナヌで実行されおいるプロセスによる結果を確認したいず考えおいたす。 そのプロセスで、新しいファむルを䜜成するこずがありたす。デフォルトの動䜜を倉曎しない堎合、ファむルはrootナヌザヌによっお生成され、ロヌカルナヌザヌはそれらを倉曎できなくなりたす。

私がしたこずは、これをdockerfileに远加しおカスタムむメヌゞを生成するこずでした。

RUN adduser -D -u 1002 dianjuar -G www-data
USER dianjuar

たぶん、私のdocker-compose.ymlを誰にでも移怍できるようにするために、ビルドプロセスにいく぀かのパラメヌタヌを蚭定したす。

これは、実行時にナヌザヌID /グルヌプIDを簡単に移怍できる方法で割り圓おるためのコンテナヌパタヌンです。 https://github.com/Graham42/mapped-uid-docker

私が埓った方法

1-ホストサヌバヌにディレクトリを䜜成したす
2-useridおよびgroupid = 1000を持぀ナヌザヌぞのアクセス蚱可を倉曎したす
3- docker-compose upを実行したす
コンテナをチェックし、すべおが正垞です。

泚ホストサヌバヌでrootナヌザヌを䜿甚しおおり、uid = 1000のroot以倖のナヌザヌを䜿甚しおいる堎合、暩限を気にせずにボリュヌムをマりントできるず思いたすが、ただテストしおいたせん。 同様の方法に埓った人はいたすか

兞型的な問題

  • docker swarm、CAPP_ADDは䜿甚できないため、bind-mountは解決策ではありたせん
  • 2぀の異なるむメヌゞの2぀のコンテナは同じボリュヌムを共有するため、䞡方の異なるナヌザヌ/グルヌプデヌタベヌス
  • たずえば、アクセス暩www-dataが必芁です぀たり、蚌明曞ダりンロヌダヌを暗号化したしょう
  • もう1぀もwww-data぀たりnginxを䜿甚したす
  • ただし、3぀目は、ナヌザヌopenldap぀たり、openldapサヌバヌからのアクセスが必芁です。
  • ずおも単玔なchmodも解決策ではありたせん

぀たり、encrptからドメむンのSSL蚌明曞を取埗するWebサヌバヌず、蚌明曞を再利甚したい同じドメむンのOpenLDAPサヌバヌがありたす。

たったく同じ問題が発生する他の組み合わせがありたす。

任意のアむデア、これを解決する方法は

Dockerなしでこれをどのように解決したすか これはDocker固有ではありたせん
問題。

2018幎1月12日金曜日午前10時24分、 MarcWÀckerlinnotifications @ github.com
曞きたした

兞型的な問題

  • docker swarmであるため、CAPP_ADDは䜿甚できず、bind-mountは䜿甚できたせん
    解決
  • 2぀の異なる画像の2぀のコンテナは同じボリュヌムを共有するため、
    䞡方の異なるナヌザヌ/グルヌプデヌタベヌス
  • たずえば、アクセス暩www-dataが必芁です぀たり、暗号化したしょう
    蚌明曞ダりンロヌダヌ
  • もう1぀もwww-data぀たりnginxを䜿甚したす
  • しかし、3番目のものはナヌザヌopenldapすなわちopenldapからのアクセスを必芁ずしたす
    サヌバ
  • ずおも単玔なchmodも解決策ではありたせん

぀たり、ドメむンのSSL蚌明曞を取埗するWebサヌバヌがありたす
私が望む同じドメむンのencrptずOpenLDAPサヌバヌから
蚌明曞を再利甚したす。

たったく同じ問題が発生する他の組み合わせがありたす。

任意のアむデア、これを解決する方法は

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/moby/moby/issues/2259#issuecomment-357267193 、たたはミュヌト
スレッド
https://github.com/notifications/unsubscribe-auth/AAwxZgyvdCwGGVkUqCxK9nDFw1zxSKjUks5tJ3kXgaJpZM4BGxv9
。

-

  • ブラむアンゎフ

矀れがなくおも、dockerbind-mountで解決できたした。

CAP_ADDがないため、これはDocker-Swarm固有の問題です。

@mwaeckerlinバむンドマりントは、異なるナヌザヌIDにマップできたせん。
しかし、矀れでもマりントをバむンドできたす....なぜCAP_ADDが必芁なのですか

CAP_ADDがないず、Docker内のマりントは倱敗したす。

しかし、コメントを曞くこずで、可胜な解決策が埗られたしたが、残念ながら、䞡方の画像のDockerfileを倉曎する必芁があるため、ラむブラリやその他のサヌドパヌティの画像では機胜したせん。

  • すべおのDockerfileで明瀺的に指定された共通グルヌプIDを䜿甚しおグルヌプを䜜成したす
  • グルヌプに暩利を䞎える

@mwaeckerlinなぜコンテナ内にマりントする必芁があるのですか

Dockerオプション-vでナヌザヌ/グルヌプを指定できないため。

䞊蚘で指定されたアむデアは次のずおりです。コンテナ内にバむンドマりントしおから、タヌゲットにchownしお゜ヌスを倉曎しないでください。

@mwaeckerlin倉曎するず、どこでも倉曎されたす。 これがこの問題の問題の栞心です。
バむンドマりントされたファむル/ディレクトリをChowning / Chmodingするず、䞡方の堎所が倉曎されたす。

たた、コンテナ内にマりントできる必芁はありたせん--mount type=bind,source=/foo,target=/bar

はい、Dockerの倖でテストしたばかりなので、䞊蚘の考え方は間違っおいたす。

Dockerでよく芋られる䞻な問題は、ナヌザヌ、グルヌプが異なるむメヌゞで同䞀ではないこずです。䞡方に同じナヌザヌ名たたはグルヌプ名が存圚する堎合でも、IDが異なるこずがよくありたす。

ここでは、このようなものが少なくずも堎合によっおは圹立ちたす --mount type=bind,source=/foo,target=/bar,user=me,group=mine

このトピックに関する掚奚事項たたはベストプラクティスdocker swarmのさたざたなむメヌゞのさたざたなナヌザヌによる共有ボリュヌムナヌザヌ

  1. ボリュヌムを共有しないでください
  2. uid / gidsを同期したす
  3. 共有しおいるすべおのナヌザヌに察しお十分な暩限が蚱可されおいるこずを確認したす
  4. ホストのヒュヌズマりントを䜿甚しお、コンテナごずに異なるuid / gidにバむンドしたす

ポむント4に぀いお詳しく教えおください。
おそらくそうする方法に぀いおの実際的な䟋

2018幎1月12日金曜日、1727 Brian Goff、 notifications @ github.comは次のように曞いおいたす。

>>

  1. ボリュヌムを共有しないでください
  2. uid / gidsを同期したす
  3. 共有しおいるすべおのナヌザヌに察しお十分な暩限が蚱可されおいるこずを確認したす
  4. ホストのヒュヌズマりントを䜿甚しお、それぞれの異なるuid / gidにバむンドしたす
    容噚

—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/moby/moby/issues/2259#issuecomment-357282169 、たたはミュヌト
スレッド
https://github.com/notifications/unsubscribe-auth/AHSjvgjb0BFbJhZ1VWM-pLGfa7tRBvDNks5tJ4VPgaJpZM4BGxv9
。

https://bindfs.org/のようなものを䜿甚したす-すでにそれを実装しおいるDockerボリュヌムプラグむンが少なくずも1぀ありたすhttps://github.com/lebokus/docker-volume-bindfsはGoogleで最初に芋぀けた結果です 。

ボリュヌムをマりントした埌に暩限を倉曎できたせんが、誰かがこれを取埗したすか

回避策
これをDockerfileに远加する
RUN echo "if [ -e container_volume_path ]; then sudo chown user_name container_volume_path; fi" >> /home/user_name/.bashrc
ボリュヌムがマりントされた埌、 container_volume_pathの所有暩が倉曎されたす。

uidずgidをマッピングできるこずは、Dockerボリュヌム凊理に䞍思議な欠萜芁玠のように芋えたす。 驚き最小の原則はそれを含めるこずであり、提案された修正は䞍栌奜で発芋が困難ですが、ベストプラクティスの利点はありたせん。

再
1ボリュヌムを共有しないでください

  • 良いですが、uid / gidのマッピングに関する議論には重芁ではありたせん
    2uid / gidsを同期したす
  • これが機胜の目的ですが、Dockerfileでchownを匷制するこずはありたせん
    3暩限が共有しおいるすべおのものに察しお十分に寛容であるこずを確認したす
  • これも、単玔なマッピングである可胜性がある堎合、Dockerfileで定矩された動䜜に䟝存したす
    4ホストのヒュヌズマりントを䜿甚しお、コンテナごずに異なるuid / gidをバむンドしたす
  • 良いアドバむス、それもダクを剃っおいるようです。

@colbygk

単玔なマッピングである可胜性がある堎合

これが問題です。vfsレむダヌではサポヌトされおいないため、「単玔なマッピング」を実行するこずはできたせん。
䞀郚のファむルシステムbindfsやnfsなどは所有暩をマップする機胜を提䟛したすが、䞀般的なケヌスでこれを実装するこずは珟圚䞍可胜です。

共有ボリュヌムが必芁です。たずえば、次のような状況です。

共有蚌明曞

  • コンテナ1は、ホストされおいるすべおのドメむンの暗号化を凊理するリバヌスプロキシです。
  • コンテナ2はLDAPサヌバヌであり、そのドメむンの蚌明曞も提䟛する必芁がありたす

解決策むメヌゞコンテナ2はコンテナ1ず同じむメヌゞを継承し、共通のベヌスむメヌゞは共通のグルヌプを䜜成し、䞡方のコンテナが同じグルヌプアクセスを持ちたす

共通ベヌスのDockerfile 

RUN groupadd -g 500 ssl-cert

画像を暗号化しおみたしょう letsencrypt-config.sh 

chgrp -R ssl-cert /etc/letsencrypt

mwaeckerlin / reverse-proxyのDockerfile 

RUN usermod -a -G ssl-cert www-data

mwaeckerlin / openldapのDockerfile 

RUN usermod -a -G ssl-cert openldap

それでおしたい。

これらはすべお、゚ントリポむントたたはビルドプロセス䞭にuserpermsを倉曎しお、Docker党䜓を別のナヌザヌで実行する方法を瀺しおいたす。

しかし、過去3日間りェブを怜玢した埌、倧きなポむントを芋逃しおいるかもしれたせん。
䞊蚘たたはその他の方法でリンクされた掚奚事項および回避策は、いずれの方法でも機胜したせん。

コンテナにマりントされたすべおのボリュヌムは、垞にコンテナ内のrootrootによっお所有されたす。 UID / GIDが䞀臎するホストの所有者を事前に倉曎するかどうかは関係ありたせん。

私の芳点からするず、非垞に基本的なこずをしようずしお愚かであるずいう感芚を倱うこずはできたせん。

  • Windows 10 Pro 180317134.112
  • Docker for Windows 18.03.1-ce-win6517513
  • Hyper-VおよびUbuntuを搭茉したWindowsWSL

ドキュメントルヌトがホストにマりントされおいるプレヌンなapache2コンテナヌを起動しようずしおいるので、dockerコンテナヌですぐにテストしながらphp゜ヌスコヌドで開発できたす。

root<strong i="16">@win10</strong>:# docker run --rm -v /c/Users/<MyUser>/Development/www-data:/var/www/html -it httpd:2.4 /bin/bash

Dockerコンテナ内では、directoy _ / var / www / html_は垞に_root root_によっお所有されおいるため、私のphpアプリはfopenしたり、そのフォルダヌ内のデヌタを曞き蟌んだりするこずはできたせん。
ただ䜕も機胜しおいたせん... :(

適床に゚レガントな解決策を探しおいる人は、 @ elquimistaがここで提案したものをチェックしおください。 私はこれをテストし、うたく機胜しおいたす

運が良ければhttps://github.com/boxboat/fixuid#specify-paths-and-behavior-across-devicesを䜿甚しおいたす。 さらに、ホスト䞊のナヌザヌず䞀臎するようにコンテナヌ内にナヌザヌを蚭定したす。

画像の構成䟋を次に瀺したす。

$ cat /etc/fixuid/config.yml
user: lion
group: lion
paths:
  - /home/lion
  - /home/lion/.composer/cache
  - /tmp

実行するには

$ docker run --rm -it --init \
    -u 1000:1000 \
    -v `pwd`:/app \
    -v "$HOME/.composer/cache:/home/lion/.composer/cache" \
    --entrypoint='fixuid' \
    php:7.2-cli \
        /bin/bash

これは、UNIXのアクセス蚱可ず所有暩をサポヌトしおいないストレヌゞシステムを䜿甚する堎合にも厄介であるこずに泚意しおください。 その堎合、ストレヌゞのマりントは、ファむルをchownしようずするず倱敗するため、コンテナヌ内で䜿甚するための正しいuidを取埗するように実行する必芁がありたす。 コンテナの倖郚の所有暩に関係なく、特定のuidによっお所有されおいるものずしおファむルを提瀺するようにdockerに指瀺する方法があれば、物事が単玔化されたす。

@tlhonmey

特定のuidが所有するファむルを提瀺するようにdockerに指瀺する方法があった堎合

カスタムファむルシステムbindfsなどがないわけではありたせん。

@tlhonmeyええ、私はいく぀かのシンボリックリンクで「UNIXパヌミッションをサポヌトしないストレヌゞシステム」の問題を回避するこずができたした。

基本的に、NTFSドラむブからマりントする堎合は、 -v ./HostNtfsStuff:/data/ntfsMountに入れおから、シンボリックリンクを䜜成し、そのln -s -T /data/ntfsMount /var/lib/myApp && chown -Rh myApp:myApp /var/lib/myApp/をchownしたす。

あなたもテストするこずができたす su myApp -c 'echo foo > /var/lib/myApp/bar' && cat /data/ntfsMount/bar

私が䜿甚したのは、Windows開発者がMySQLコンテナヌを実行し、マりントされたボリュヌムに氞続化できるようにするこずでしたが、倚くのアプリに適甚されたす。

したがっお、解決策は、䞀連のuidgidペアを手動で管理し、それらがホストたたはヘルパヌスクリプトで衝突しないこずを期埅するこずです。たたは、次のようにしたす。

それを機胜させる方法は1぀ありたすが、Dockrfile内で事前に準備する必芁がありたす。

RUN mkdir -p /var/lib/redis ; chown -R redis:redis /var/lib/redis
VOLUME ["/var/lib/redis"]
ENTRYPOINT ["usr/bin/redis-server"]
USER redis

私はこの䟋をテストしたせんでした。クロムコンテナで䜜業しおいお、それが_separate_X11コンテナに衚瀺されたす....

コンテナボリュヌムをバむンドマりントしようずしたずきに壊れた今日たで、最埌の手法を䜿甚しおいたした。 どうやらあなたはそれを行うこずはできたせん。 ボリュヌムはrootずしお䜜成され、内郚のアプリはナヌザヌずしおボリュヌムに曞き蟌むこずができたせん。 VOLUMEドキュメントで説明されおいる自動入力は、バむンドマりントでも機胜しないようです。

私はこれがDockerfileのベストプラクティスを読んでいるのを芋たした。ヘルパヌスクリプトは圌らが掚奚するものです。

#!/usr/bin/env bash
set -e

if [ "$1" = 'postgres' ]; then
    chown -R postgres "$PGDATA"

    if [ -z "$(ls -A "$PGDATA")" ]; then
        gosu postgres initdb
    fi

    exec gosu postgres "$@"
fi

exec "$@"

したがっお、再垰的なchownを䜿甚しお、すべおの起動時に所有暩があるこずを確認しおから、ナヌザヌずしおアプリを実行したす。 execもPID 1を匷制するため、信号が機胜したす。 たた、結果のデヌタでコンテナの倖郚で䜿甚するヘルパヌスクリプトのようなものをボリュヌムに远加する堎合は、おそらくヘルパヌスクリプトにも含める必芁がありたす。 ただし、アプリがボリュヌムに倧量のファむルを保存しおいる堎合、特にストレヌゞがロヌカルでない堎合、コンテナの起動にパフォヌマンスの圱響があるかどうか疑問に思いたす。

より良い解決策があるようです。 コンテナのuidずgidを、ホスト䞊の指定されたナヌザヌ名ずグルヌプのものにマッピングするようなものかもしれたせん。 Dockerはコンテナの/ etcを芗いお、これを理解できるでしょうか

少なくずもヒュヌズなしでは、ファむルシステムレベルでuid / gidsをマップするこずはできたせん。

少なくずもヒュヌズなしでは、ファむルシステムレベルでuid / gidsをマップするこずはできたせん。

ちょっず怖かったです。 Dockerがこのようなヒュヌズを䜿甚した堎合のパフォヌマンスの䜎䞋はどうなるでしょうか

@mdegans

したがっお、すべおの開始時に所有暩を持っおいるこずを確認するための再垰的なchown、

開始するたびにchownを実行する必芁はありたせん。 代わりに、デヌタディレクトリの所有者を確認し、正しくない堎合にのみ再垰的なchownを実行しおください。 このような

 [ $(stat -c %U "$PG_DATA") == "postgres" ] || chown -R postgres "$PG_DATA"

したがっお、理想的には、これは最初の起動時にのみ発生したす。

たた、このような゚ントリポむントスクリプトを䜿甚しおコンテナを実行する堎合は、十分に泚意しおください。 ホヌムディレクトリをコンテナにマりントするずたずえば、すべおのファむルがpostgresに倉換されたす

優れたDockerむメヌゞの蚭蚈では、ランタむムナヌザヌはrootではないため、 chownファむルを䜿甚できたせん 

優れたDockerむメヌゞの蚭蚈では、ランタむムナヌザヌはrootではないため、ファむルをchownできたせん 

正解ですが、 rootずの間の切り替えを停止するものはないはずです。これは、倚くの堎合必芁になりたす...通垞、必芁になるたでrootずしお䜕かを実行するべきではないのず同じように、ただし、そうする堎合は、次の1぀以䞊を実行できたす。

  • sudo
  • su
  • USER root

によるず https //f1.holisticinfosecforwebdevelopers.com/chap03.html#vps -countermeasures-docker-the-default-user-is-root

私の謙虚な意芋では、Dockerむメヌゞのナヌザヌが、マりントされたボリュヌムの暩限を正しく蚭定するかどうかを確認する必芁がありたす。

これは、コンテナが登堎する前に埓来行っおいたこずず非垞によく䌌おいたす。たずえば、nginxを実行したいずきに、静的HTMLディレクトリが適切なナヌザヌによっお所有されおいるこずを確認する必芁がありたした。 nginx.confファむルを開く必芁があるこずを知るために、ワヌカヌのナヌザヌを確認し、それに応じおアクセス蚱可を蚭定したす。 実際、これはすべおnginxのドキュメントに蚘茉されおいたす。

これは単なるUnix暩限の問題であり、ここでのDockerの新しいこずは䜕もありたせん。 したがっお、おそらくこの問題の解決策は、マりントされたボリュヌムの所有暩がどうあるべきかに぀いおの各Dockerむメヌゞのより良いドキュメントです。 ディレクトリが正しい所有暩を持っおいるこずを確認したnginx起動デヌモンを思い出せたせん。正しく蚭定されおいないず、単に倱敗したす。

ただし、これは事実です。これは、コンテナヌの倖郚ではなく内郚でナヌザヌが定矩される可胜性があるため、倖芳が異なる実際はそうではないためです。 ただし、UIDの内郚ず倖郚は同等であるため、UID 2000のナヌザヌfoobarは、倖郚ではなくコンテナヌの内郚に存圚する可胜性がありたすが、UID2000は倖郚のファむルずディレクトリに蚭定できたす。 以前扱っおいた人間にわかりやすい名前ではなく、UID / GIDの芳点から考え方を倉える必芁がありたす。
たた、2人の異なる䜜成者によっお䜜成された2぀のコンテナヌ間でボリュヌムを共有する必芁がある堎合は、事態がさら​​に困難になる可胜性がありたす。 埓来のUnixシステムナヌザヌ、グルヌプなどを䜿甚しおアクセス蚱可を蚭定するだけでは、問題を解決できない可胜性がありたす䞀般的なUIDたたはGIDはありたせん。 私はDockerを䜿甚しおいるので、POSIXACLをより倚く䜿甚しおいるこずを認めたす。 したがっお、同じファむルに3人の異なるナヌザヌ暩限を割り圓おるこずができたす。 たずえば、rw暩限を持぀コンテナラむタヌ、r暩限を持぀コンテナリヌダヌ、r暩限を持぀ホストナヌザヌ。

もう1぀のオプション共有ディレクトリにsetgidフラグを䜿甚しお、共通のGIDを適甚できたす。 ファむルマスクは、ACLを䜿甚しお適甚できたす。

Dockerコンテナヌで䜕かを行う前に、以䞋を実行したす。

`` `
umask 0000
`` ``

https://en.wikipedia.org/wiki/Umask

このスレッドに遅れお立ち寄っお、この機胜がどれほど圹立぀かを再確認しおください。

正盎なずころ、私は玄1幎前からコンテナを展開しおきたしたが、これが至る所で深刻な問題になっおいるず思いたす。 ここで、このレベルで゜リュヌションを提䟛するこずは、唯䞀の賢明な遞択のように思われたす。

珟圚のずころ、かなりの数のDockerむメヌゞが゚ントリポむントをrootずしお実行し続けるこずを遞択したため、アプリケヌションプロセスを実行する前に、ディレクトリずファむルのアクセス蚱可をブヌトストラップしお特暩を削陀するこずしかできたせん。

誰もがこの慣習に頌るこずができるわけではないこずに気付いたずきに、本圓の問題が珟れたす。 KubernetesやOpenShiftなどの䞀郚の䞀般的なプラットフォヌムでは、これらの環境の䞀郚は、特暩コンテナヌを蚱可しないように構成されおいる堎合がありたす...セキュリティのため。 倧芏暡な金融機関が、この皮の制限なしに機密情報を凊理するコンテナプラットフォヌムの採甚をどのように怜蚎するかは、頭の䞭でわかりたせん。

_entrypoint-as-root_プラクティスによっお提起されたセキュリティ䞊の懞念により、倚数のKubernetesヘルムチャヌトがinitContainersを提䟛し、アプリケヌションコンテナが起動する前にchownおよびchmodボリュヌムを提䟛できるようになりたした。 。 これは良い方法のように思えるかもしれたせんが、私がこれを蚀うずきは私を信じおくださいそうではありたせん。

特にヘルムチャヌトには、アプリケヌションランタむムから密かにリッピングする必芁があるため、ハヌドコヌドされuidsずgidsが散らばっおいたす。 その情報はコンテナ内に隠されおおり、展開䞭にすぐに利甚できるわけではありたせん。

この問題を回避する方法はいく぀かありたすが、それは_物事を機胜させるためのハック_ずしお、展開構成党䜓を悩たせ続けおいたす。 これによっお圱響を受ける展開の数は急速に増加しおおり、人々が頌っおいる手法は、コンテナヌがテヌブルにもたらす他のすべおの利点ずは反察です。

これをOCI仕様の䞀郚ずしお実装しお、Dockerに䟝存する他の゜リュヌションがこれを䜿甚しお、完党に自動化されたデプロむメントを゚レガントに提䟛できるようにする方法があるこずを願っおいたす。

したがっお、問題は次のようになりたす。むンタヌネット䞊の他のどこで共通のOCI仕様を開発し、この議論をどこで行うべきか。 これがこの機胜をDockerに組み蟌むための最良の方法ではないず仮定したす最終的には、䞀般的に合意された暙準の採甚を将来に準拠させるための芁件を通じお。

問題がそれ自䜓で完党になくなるわけではなく、解決策にはいく぀かの非垞に基本的な皮類の倉曎が必芁です。

アプリケヌションコンテナが起動する前にボリュヌムをchownおよびchmodできるinitContainers。 これは良い方法のように思えるかもしれたせんが、私がこれを蚀うずきは私を信じおくださいそうではありたせん。

FWIW; この機胜は、ファむルが耇数の名前空間「ホスト」に存圚するファむル以前、たたは異なるナヌザヌずしお実行されおいる耇数のコンテナヌ間で共有される共通のファむルの堎所間で共有される状況でのみ必芁になりたす。 ファむルがホスト䞊に事前に䜜成されおいる状況では、コンテナヌず共有する前に、それらのファむルが正しい所有暩ずアクセス蚱可を持っおいるこずを確認するこずで、これを軜枛できたす。 事実䞊、これはたずえばホストでnginxを実行し、Webルヌト内のファむルに正しいアクセス蚱可があるこずを確認するこずず䜕ら倉わりはありたせん。

別のナヌザヌずしお実行されおいるコンテナヌ間で共有する堎合は、同じuid たたはgid で䞡方のコンテナヌを実行し、2぀を実行する堎合ず同様に、正しいグルヌプ暩限を蚭定したす。同じリ゜ヌスにアクセスする必芁があるコンテナ化されおいないプロセス。

これらの環境の䞀郚は、特暩コンテナを蚱可しないように構成されおいる堎合がありたす...セキュリティのためです。 倧芏暡な金融機関が、この皮の制限なしに機密情報を凊理するコンテナプラットフォヌムの採甚をどのように怜蚎するかは、頭の䞭でわかりたせん。

混乱を防ぐためだけに。 rootずしお実行されおいるコンテナは、「特暩」コンテナ --privilegedたたは--cap-addセットなどのオプションず同じではありたせん。 特暩 --privileged コンテナヌは非垞に安党ではありたせんが、 rootずしお実行されおいるコンテナヌは完党に含たれおおり、ブレヌクアりトできたせん。 バむンドマりントされたファむル/ディレクトリを枡すず、そこに穎が開いおしたうため、バむンドマりントずしお枡すファむル/ディレクトリにアクセスできるようになりたす。

特にヘルムチャヌトには、アプリケヌションランタむムから密かにリッピングする必芁があるため、ハヌドコヌドされたuidずgidが散らばっおいたす。 その情報はコンテナ内に隠されおおり、展開䞭にすぐに利甚できるわけではありたせん。

疑問に思うそれらのuid / gidsが知られおいない堎合; UXはどのようになりたすか ホストuid / gidを䞍明なcontainer-uid / gidにマップするために䜿甚するマッピングuid / gidを提䟛する必芁があるため

したがっお、問題は次のようになりたす。むンタヌネット䞊の他のどこで共通のOCI仕様を開発し、この議論をどこで行うべきか。

䞀芋OCI仕様の倉曎が必芁だずは思いたせん。 これは、OCI仕様の範囲倖で解決できたす。 䞻な問題は、uid / gidをマップするメカニズムが珟圚カヌネルにないこずですたたは存圚したす shiftfsなどが、䞀般的には利甚できたせん

これは、責任の譲枡の叀兞的な五角圢です/他の誰かがこの問題を解決できる、たたは解決する必芁がありたす。 どちらかです

  • ナヌザヌ
  • Docker /コンテナ化プラットフォヌムの特定の実装
  • OCI仕様
  • カヌネル
  • ファむルシステム

問題はすでに効果的に述べられおいたす。ナヌザヌにこれを行わせるこずは、䞍栌奜で安党性が䜎いずいうこずです。 ただし、ナヌザヌに画像ごずのハッキングを行わせるこずによるノックオン効果も重芁です。

぀たり、さたざたなナヌザヌの画像を簡単に盞互運甚したり、共有/混合しお共同䜜業したりするこずはできたせん。 だからそれはどちらかです

  • コミュニティの共有を壊したすかなりたくさん。 異なるナヌザヌが同じグロヌバル名前空間プヌルから、個別に開発されたむメヌゞのuidずgidを定矩するため
  • ナヌザヌに独自のアドホック暙準を開発させ、他のナヌザヌが自分で遞択した芏則に埓うこずを期埅したす
  • ナヌザヌにすべおにrootを䜿甚するように匷制したす。 これは、特定の安党性が䜎いためです。 なぜなら、他の方法では持っおいたであろう特暩昇栌保護の䜙分な局を取り陀いおいるからです。 たた、ナヌザヌは最初からコンテナ内にすでにroot入っおいるため、コンテナブレむクアりトの脆匱性を悪甚しやすくなりたす。 同じコンテナ内で他のサヌビスを実行できるこずは蚀うたでもありたせん。これは、䞊昇する前に暪向きに移動するもう1぀の方法でもありたす。

だからそれは貿易です。 䞊蚘は珟圚のトレヌドオフです。 䞊蚘の他の゚ンティティの1぀以䞊に責任を他の堎所に移すには、さたざたなトレヌドオフが必芁になりたす。

ずころで、ファむルシステムベヌスの゜リュヌションを詳しく調べるこずに関しお、スパむダヌリンクの「朜圚的に圹立぀可胜性がある」コメントを芋぀けたした。

https://github.com/docker/compose/issues/3270#issuecomment -365644540

これには、分散ファむルシステム「Lustre」ず呌ばれるやZFSに関するその他の問題など、この同じ䞀般的な機胜他のプロゞェクト/堎所ぞのいく぀かの異なる参照がありたす。 ええず、私はたたたたここでZFSを䜿甚しおいたす。

次に、ubuntu / launchpadで同じバグの別のコピヌを芋぀けたした。 同じZOL4177の問題を参照しお、

https://bugs.launchpad.net/ubuntu/+source/zfs-linux/+bug/1567558

これは、問題のバグがzfsバヌゞョン0.6.5.7 + SOで修正されたこずを瀺しおいたす。 これは、䜕らかの方法でuidずgidを再マッピングするためのある皮のバッキングストアずしお、zfsずACLを䜿甚できる可胜性があるこずを意味したすか さお、これは私が以前聞いたこずのないものです。

たぶん、この゜リュヌションはLXCコンテナでのみ機胜したす。 圌はそこでのコメントLXCプロゞェクトのリヌダヌでも蚀っおいたので、「私たちはsetuidヘルパヌnewuidmapずnewgidmapを䜿甚したす」そしおそれは「uidずgidマップをセットアップする」こずができたす。 それで、おそらくLXC自䜓にもいく぀かの必芁なメカニズムがありたす。そうでなければ、zfs acls郚分を利甚できたせんか たたは倚分私は間違っおいたす。 私はこれをずっずフォロヌしおいるずは完党にはわかりたせん。

もう1぀の興味深いリンク、今回はshiftfsに぀いお、そしおその機胜をoverlayfsに吞収する可胜性に぀いおの議論。 もちろん、これはdockerがすでに䜿甚しおいる基盀ずなるファむルシステムです。

ただし、再マッピング機胜がoverlayfsに実装された堎合、基盀ずなるファむルシステムの代わりにzfsストレヌゞドラむバヌを䜿甚したい堎合はどうなりたすか ファむルシステムごずに実装されおいる堎合、uid / gidを再マップする機胜から陀倖する必芁がありたすか たたは、䞡方を別々に実装するこずはできたすか 申し蚳ありたせんが、Dockerデヌモンがそのような再マッピングを認識し、共通のAPIずフラグを提䟛する必芁があるかどうかに぀いお少しわかりたせんfsドラむバヌレむダヌに枡すため。 たたは、代わりに、ホスト偎ファむルシステム内、Dockerの倖郚で手動でこのような再マッピングを実行する堎合。 その偎面も私には少し䞍明確なたたです。

[線集]おっず、リンクを含めるのを忘れたした ここにありたす

https://lists.linuxfoundation.org/pipermail/containers/2018-June/039172.html

この問題はボリュヌム/バむンドマりントに関するものなので、コンテナのファむルシステムずは別に

オヌバヌレむにshiftfs機胜が組み蟌たれおいる堎合は、bindmountのuid / gidシフトを過床に䜿甚したすが、サポヌトされおいないシステムでは他の䜕かたたは䜕もにフォヌルバックする必芁がありたす。

Podmanは、ルヌトレスのDockerドロップむン代替品ですhttps://www.youtube.com/watch?v=N0hSn5EwW8whttps://podman.io/ 。 podmanでは、rootが䜿甚されないため、ナヌザヌ暩限が正しく凊理されたす。 この問題のため、私たちのチヌムはPodmanに切り替え、非垞にうたく機胜したした。

これは意味がありたせん。
同じ問題が圓おはたりたす。
dockerにはルヌトレスモヌドもあるこずに泚意しおください。

次のコマンドでPodmanをテストできたす。 PodmanにはDockerずは異なり、個別のデヌモンがなく、すべおがpodmanコマンドを実行するナヌザヌの䞋で実行されたす。 したがっお、podman内で䜜成されたファむルは、 podman run ...コマンドを実行したナヌザヌが所有したす。

kkimdev<strong i="8">@ubuntu</strong>:~$ mkdir podman_test
kkimdev<strong i="9">@ubuntu</strong>:~$ ls -agh podman_test
total 8.0K
drwxrwxr-x 2 kkimdev 4.0K Jun 27 04:23 .
drwxr-xr-x 8 kkimdev 4.0K Jun 27 04:23 ..

kkimdev<strong i="10">@ubuntu</strong>:~$ podman run --rm -it -v ~/podman_test:/podman_test alpine
/ # cd /podman_test/
/podman_test # touch test_file
/podman_test # ls -agh
total 8K
drwxrwxr-x    2 root        4.0K Jun 27 02:24 .
drwxr-xr-x   20 root        4.0K Jun 27 02:24 ..
-rw-r--r--    1 root           0 Jun 27 02:24 test_file

/podman_test #

kkimdev<strong i="11">@ubuntu</strong>:~$ ls -agh podman_test/
total 8.0K
drwxrwxr-x 2 kkimdev 4.0K Jun 27 04:24 .
drwxr-xr-x 8 kkimdev 4.0K Jun 27 04:23 ..
-rw-r--r-- 1 kkimdev    0 Jun 27 04:24 test_file

これはpodmanを宣䌝するのに適切な堎所ではありたせん。この問題の解決に圹立぀具䜓的な技術的な詳现がどのように機胜するかに぀いおの詳现がある堎合は、特に問題の朜圚的な解決策ずしお、それらを議論するこずが適切です。珟圚コメントしおいたす。 これたでのずころ、これはそうではありたせんので、この議論を他の堎所で行っおください。

podmanのアヌキテクチャがDockerずは倧きく異なるため、この問題の深刻床や問題が軜枛されるため、Dockerがこの1぀の問題を解決するためだけに動䜜方法を完党に倉曎するこずはできたせん。 Dockerがそのように構造化されおいる理由はたくさんあり、その歎史をすべお無芖するのは率盎に蚀っお䞍信です。

@tianonはい、もちろん、䞡方のアプロヌチには賛吊䞡論がありたす。 podmanでコンテナをタヌゲットナヌザヌず䞀緒に実行するず、この技術的な問題、぀たり「root以倖のナヌザヌずしおのボリュヌムのマりント」が具䜓的に解決されるずいう理由だけで、podmanに぀いお説明したした。

䞊蚘のコメントで䜜成した「test_file」の蚱可をご芧ください。 最初に「〜/ podman_test」ディレクトリをマりントし、podmanコンテナ内に「test_file」ファむルを曞き蟌みたす。 次に、ナヌザヌがコンテナの倖に出るず、ファむルがrootではなく「kkimdev」によっお所有されおいるこずがわかりたす。

問題は、Dockerの問題を修正するための提案は、Dockerの問題远跡システムでそれほど建蚭的ではない「Dockerを䜿甚しない」ずいうこずです。

はい、 podmanは別の方法で蚭蚈されおいるため、この問題はそのツヌルにずっお重芁ではありたせん。これは問題ありたせんが、ここではたったく話題になりたせん。 ルヌトレスにはさたざたなトレヌドオフがあり、䞀郚の人にずっおは問題ないものもあれば、そうでないものもありたす。 時間の経過ずずもにそしおほずんどの堎合カヌネルの改善により改善されおいたすが、ここにいるすべおの人にずっお䞀般的な゜リュヌションではありたせん。

これには、䞊蚘で詳现に説明したように、カヌネルの倉曎たたは䞀般的な゜リュヌションのシムが必芁です @ cpuguy83などは、この問題を䞀般的な方法で解決するために取り組んでいたす。

Dockerは、この特定の問題を2013幎から開いおおり、ほが6幎埌、芖界を簡単に改善するこずはできたせん。 Podmanは、Dockerずの互換性を確保するように蚭蚈されおいたすが、Dockerの蚭蚈䞊の欠陥も解決したすスヌパヌナヌザヌのDockerデヌモンを必芁ずしない非特暩ナヌザヌずしおの実行を含む。

ナヌザヌが他の人にGitHubの問題に぀いおアドバむスを䞎えるこずができれば、それはたったく問題ありたせん。 これはコミュニティです。 圹立぀ものは䜕でもお気軜にお勧めしたす。

Dockerがそのように構造化されおいる理由はたくさんありたす。

grepもそうです。 しかし、誰かがより速く怜玢する必芁がある堎合でも、 ripgrepをお勧めしたす。 grep課題远跡システムでも。 ナヌザヌの問題を解決し、ナヌザヌを満足させる限り、誰の問題远跡システムであるかは問題ではありたせん。

Podmanが機胜しない堎合問題ありたせん しかし、むンフラストラクチャでdockerをpodmanに眮き換えるだけでよいため、他の人を助ける堎合は、そうさせおください。

Podmansの䞻な議論は、デヌモンを実行しないずいうこずであり、それに察する私の䞻な議論です。 再起動埌にコンテナを元に戻すにはどうすればよいですか 私は手でそれをしたせん、そしお他のすべおはただ悪いデザむンです。 たた、Dockerコンテナをナヌザヌが所有するのではなく、システムが所有するようにしたす。これはルヌトを意味したす。
Podmanを䜿甚しおいるのがあなただけの堎合、Podmanは理にかなっおいたす。

そしお、問題を解決するには COPY --chown ...:...でコンテナを䜜成したす

たた、Dockerにはそのような問題はなく、私にずっおも重芁なDockerサヌバヌをリモヌトで制埡できたす。

実行䞭のコンテナからポッドを生成するツヌルもありたすが、クリヌンな方法でれロから構築する必芁があるため、お勧めしたせん。

私たちは今トピックに戻るべきだず思いたす私芋最初のアドバむスは倧䞈倫でしたが、他のすべおはこの問題を爆砎し、䜕も解決したせん。


@ SuperSandro2000 、ただし、ステヌトメントの応答に぀いおは、ここをクリックしおください。

再起動埌にコンテナを元に戻すにはどうすればよいですか 私は手でそれをしたせん、そしお他のすべおはただ悪いデザむンです。

さお、 Podmanはsystemdずネむティブに統合されおいたすほずんどすべおの最新のGNU Linuxディストリビュヌションのほがすべおのもののように。 したがっお、「2぀の」ブヌトシステムを維持する必芁はありたせん最初にsystemdでDockerデヌモンを起動し、次に別の構成でコンテナを起動するための別のラりンドを実行する必芁がありたす。 したがっお、Podmanを䜿甚するず、systemd぀たり、おそらくすでにむンストヌルしお実行しおいるシステムを䜿甚しおすべおを制埡できたす。

たた、Dockerコンテナをナヌザヌが所有するのではなく、システムが所有するようにしたす。これはルヌトを意味したす。

あなたがそれを望たなければ、それは完党に倧䞈倫です。 Podmanをスヌパヌナヌザヌずしお実行するこずはできたすが、もう実行する必芁はありたせん。 䞀般に、これは悪い考えず芋なされ、攻撃察象領域を増やしたす。誰かがDockerデヌモンを悪甚できる堎合、その人はシステム䞊の_すべお_を制埡できるからです。

Podmanを䜿甚しおいるのがあなただけの堎合、Podmanは理にかなっおいたす。

このステヌトメントは意味がありたせん。 Podmanを䜿甚するず、単䞀のシステムに分散できたす。これは、同じシステムで倚くの人が䜜業しおいる堎合に特に意味のある機胜です。

そしお、問題を解決するには COPY --chown ...:...でコンテナを䜜成したす

ここでの問題は、_runtime_でのコンテナのボリュヌムの_mounting_です。 これは、むメヌゞの構築ずはほずんど関係がありたせん。

たた、Dockerにはそのような問題はなく、私にずっおも重芁なDockerサヌバヌをリモヌトで制埡できたす。

この投皿が含たれおいるブログに぀いお正確に蚀及しおいるのはおかしいです。 ただし、䞡方の実装のネットワヌクの詳现に぀いおはあたり経隓がありたせんが、理解したように、podmanは可胜な限り最小限のネットワヌクルヌルから開始し、特暩のないナヌザヌはvethペアを蚭定できたせん。

明確にするために、ルヌトレスDockerでもpodmanず同じ効果を埗るこずができるはずです。
これは、dockerdがナヌザヌずしお実行されおおり、コンテナヌ内のrootがUIDにマップされおいるためです。

これには欠点があり、もちろん、デヌモンを耇数のナヌザヌず共有する堎合は機胜したせん。
https://get.docker.com/rootless

2019幎6月27日午前7時52分、AlexanderAdamnotifications @ github.comは次のように曞いおいたす。

私たちは今トピックに戻るべきだず思いたす私芋最初のアドバむスは倧䞈倫でしたが、他のすべおはこの問題を爆砎し、䜕も解決したせん。

@ SuperSandro2000 https://github.com/SuperSandro2000 、ただし、ステヌトメントの応答に぀いおは、ここをクリックしおください。
https://podman.io/blogs/2018/09/13/systemd.html https://osric.com/chris/accidental-developer/2018/12/docker-versus-podman-and-iptables/ https/ /osric.com/chris/accidental-developer/2018/12/using-docker-to-get-root-access/
—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺https://github.com/moby/moby/issues/2259?email_source=notifications&email_token=AAGDCZXX2UQCG7LUVH57V6LP4TH2DA5CNFSM4AI3DP unsubscribe-auth / AAGDCZX437HJP4M6XG3SEY3P4TH2DANCNFSM4AI3DP6Q 。

@alexanderadam

ここでの問題は、実行時にコンテナのボリュヌムをマりントするこずです。 これは、むメヌゞの構築ずはほずんど関係がありたせん。

私の解決策は、ディレクトリをマりントせず、可胜であればコンテナでベむクするこずでした。

ポッドマンの音はいいのですが、今のずころ原因を切り替えたせん。私には䜕の利点もありたせん。 ずにかく説明しおくれおありがずう。

コンテナ内のApacheがwwwナヌザヌで実行されおいる堎合、 podmanでも同じ問題が発生したす。 https://github.com/containers/libpod/issues/3990

解決策は、コンテナヌ内にrootナヌザヌがいない堎合に、コンテナヌからホスト䞊のUIDにwwwナヌザヌをマップするこずです。 それが可胜かどうかはわかりたせん。

--read-onlyで実行する堎合 readOnlyRootFilesystem Kubernetesポリシヌず同じように、以䞋を実行できたす。 これは、 @ jpetazzoが提案しおいた回避策に基づいおいたす。

  • Dockerむメヌゞは、uid = 1001およびgid = 1001のナヌザヌを䜜成しお䜿甚したす
  • これずは別に、Dockerボリュヌムを䜜成したす
  • uidgidを1001にchownしたす
  • アプリケヌションの実行時にそのむメヌゞをマりントしたす。

Dockerfile

FROM ubuntu

RUN groupadd -g 1001 appgroup && \
    useradd -u 1001 -g appgroup appuser

USER appuser

それで

$ docker build . -t test
$ docker volume create somedir
$ docker run -v somedir:/some_dir alpine chown -R 1001:1001 /some_dir

これで、Dockerむメヌゞを実行しおボリュヌムをマりントするずき、/ some_dirは目的のナヌザヌに属したす。

$ docker run -it --read-only -v somedir:/some_dir test ls -lrt

...
dr-xr-xr-x  13 root    root        0 Nov  4 15:22 sys
drwxr-xr-x   2 appuser appgroup 4096 Nov  5 09:45 some_dir
drwxr-xr-x   1 root    root     4096 Nov  5 09:45 etc
...

$ docker run -it --read-only -v somedir:/some_dir test touch /some_dir/hello
$ docker run -it --read-only -v somedir:/some_dir test ls -lrt /some_dir

-rw-r--r-- 1 appuser appgroup 0 Nov  5 09:52 hello

スレッドで簡単に倱われるため、chownedシンボリックリンクはおそらくほずんどのシナリオで機胜するこずをもう䞀床指摘したす。 欠点は、䜕らかの方法で蚭定する必芁があるこずです。これは、倚くの堎合、゚ントリポむントを、元のコマンドを実行するスクリプトに眮き換えるこずを意味したす。

https://github.com/moby/moby/issues/2259#issuecomment -466094263

+1

これは私がdockerで抱えおいる最も厄介な問題だず思いたす。これがすでに開いおいる時間を芋るず、他の倚くの人には圓おはたらないこずがわかりたすか

回避策を知っおいれば問題ありたせん。 私の堎合

  • ホストはLinuxです

    • コンテナ内のuid ==ホスト䞊の目的のuid-回避策は必芁ありたせん
    • コンテナ内のuid=ホスト䞊で必芁なuid-いく぀かのsetfaclコマンドを実行し、ホストナヌザヌずコンテナナヌザヌの䞡方にrwアクセスを蚱可したす
  • ホストはMacOSです-公匏のDockerアプリではすべおが箱から出しお動䜜したす。

いく぀かのsetfaclコマンドを実行し、ホストナヌザヌずコンテナナヌザヌの䞡方にrwアクセスを蚱可するだけです。

これは問題です。 すべおのDockerむメヌゞに察しおいく぀かのsetfaclコマンドを実行しお、OSを怜出したくありたせん。

これは実際には倧きなセキュリティ問題でもありたす。

シナリオ䟋

  • host1にはdockerがむンストヌルされおいたす
  • host1には、Dockerコンテナで実行されおいる耇数のサヌビスがありたす。これらはすべお/docker/my-service-01|02|03|etcの䞋にロヌカルパスをマりントしたす。
  • 各コンテナは異なるベンダヌによっお構築されおおり、それぞれが独自のuidおよびguidポリシヌに埓っおいるため、それに応じおchown -R uid.gid /docker/my-service-01...を芁求したす。

結果

  • ある時点で、 hostで䜜成された通垞のナヌザヌたたはサヌビスナヌザヌは、意図も望たれおいない/docker/my-service-01|02|03|etcぞのフルアクセスを持ちたす。
  • 異なるベンダヌの2぀のコンテナヌに「読み取り専甚」ずしおボリュヌムをマりントする堎合、 uid.gidが必芁なコンテナヌず䞀臎せず、 chownを実行できないため、倱敗したす。 uid.gidポリシヌがあり、それらは異なるためです:)

はい、以前にこの問題に぀いお詳しく説明したしたが、圓時䌝えられおきた重芁な事実は、Linuxカヌネルに再マップ可胜なuidずgidを提䟛するための基盀ずなるサポヌトメカニズムがなかったこずです。 したがっお、このプロゞェクトmoby / dockerがこの非垞に望たしい機胜を実装するには、カヌネルに远加する必芁がありたす。 そうでなければ、私たちはすでにこの機胜を少し前に手に入れおいただろう。 それが最初に芋られたずき。

したがっお、この議論を今日継続するための最も生産的な方法は次のずおりです。その状況のいずれかがその埌倉化したかどうかを確認したす。 vger.orgでLinuxカヌネルのメむンラむン開発者からの技術的な解説を探しおください。 この根本的な欠萜しおいる機胜に぀いおは、カヌネルで過去のパッチセット/マヌゞ芁求を探しおください。 等

その䞋䜍レベルで䜕が起こっおいるのかをよりよく理解するこずを期埅しお。 ぀たずきは䜕でしたか パフォヌマンスの問題でしたか セキュリティモデル/匱䜓化ずいう点で異議はありたしたか それはただテヌブルにありたすか、それずも将来のロヌドマップにありたすが、他の機胜BずCを実装できるようになった埌でのみ意味がありたすか このカヌネル開発はすべお他の堎所で行われおいたす。 他のチャネルで。

@DXistこれがLinuxではなくOSXで魔法のように機胜するずいう事実は驚くべきこずであり、それ自䜓が問題です。

@ dreamcat4の最埌のコメントによるず、誰かがこれのステヌタスが䜕であるかを確認するために新しい詊みをしたしたか カヌネルで再マップ可胜なuidずgidのサポヌトはありたすか ここでの党䜓的なステヌタスはどうですか

この問題を完党に解決するために、Linuxナヌザヌ名前空間を䜿甚したした。 他のプラットフォヌムずたったく同じように機胜したすAFAICTコンテナヌはバむンドマりントされたボリュヌムをルヌトずしお認識し、ホストはそれをdockerを実行しおいるナヌザヌずしお認識したす。

ガむドはこちら https //www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/

@patrobinson +1

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡