UPDATE 2016-03-02 : Pada Docker 1.9.0, Docker telah menamai volume yang menggantikan wadah hanya-data . Jawaban di bawah ini, serta posting blog saya yang tertaut, masih memiliki nilai dalam arti bagaimana berpikir tentang data di dalam buruh pelabuhan tetapi mempertimbangkan menggunakan volume bernama untuk menerapkan pola yang dijelaskan di bawah daripada wadah data.
Saya percaya cara kanonik untuk menyelesaikan ini adalah dengan menggunakan wadah data saja . Dengan pendekatan ini, semua akses ke data volume adalah melalui wadah yang menggunakan -volumes-from
wadah data, sehingga host uid / gid tidak masalah.
Misalnya, satu use case yang diberikan dalam dokumentasi adalah membuat cadangan volume data. Untuk melakukan ini, wadah lain digunakan untuk melakukan pencadangan melalui tar
, dan juga digunakan -volumes-from
untuk memasang volume. Jadi saya pikir poin utama untuk grok adalah: daripada berpikir tentang cara mendapatkan akses ke data di host dengan izin yang tepat, pikirkan tentang bagaimana melakukan apa pun yang Anda butuhkan - backup, browsing, dll. - melalui wadah lain . Wadah itu sendiri harus menggunakan uid / gids yang konsisten, tetapi mereka tidak perlu memetakan apa pun di host, sehingga tetap portabel.
Ini relatif baru bagi saya juga, tetapi jika Anda memiliki kasus penggunaan tertentu jangan ragu untuk berkomentar dan saya akan mencoba untuk memperluas jawabannya.
PEMBARUAN : Untuk kasus penggunaan yang diberikan dalam komentar, Anda mungkin memiliki gambar some/graphite
untuk menjalankan grafit, dan gambar some/graphitedata
sebagai wadah data. Jadi, mengabaikan port dan semacamnya, Dockerfile
gambarnya some/graphitedata
adalah seperti:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
RUN mkdir -p /data/graphite \
&& chown -R graphite:graphite /data/graphite
VOLUME /data/graphite
USER graphite
CMD ["echo", "Data container for graphite"]
Buat dan buat wadah data:
docker build -t some/graphitedata Dockerfile
docker run --name graphitedata some/graphitedata
The some/graphite
Dockerfile juga harus mendapatkan uid yang sama / Gids, oleh karena itu mungkin terlihat seperti ini:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
# ... graphite installation ...
VOLUME /data/graphite
USER graphite
CMD ["/bin/graphite"]
Dan itu akan dijalankan sebagai berikut:
docker run --volumes-from=graphitedata some/graphite
Oke, sekarang yang memberi kami wadah grafit dan wadah khusus data yang terkait dengan pengguna / grup yang benar (perhatikan bahwa Anda juga dapat menggunakan kembali some/graphite
wadah tersebut untuk wadah data, mengesampingkan masukan / cmd saat menjalankannya, tetapi menjadikannya sebagai memisahkan gambar IMO lebih jelas).
Sekarang, katakanlah Anda ingin mengedit sesuatu di folder data. Jadi daripada mengikat pemasangan volume ke host dan mengeditnya di sana, buat wadah baru untuk melakukan pekerjaan itu. Mari kita sebut saja some/graphitetools
. Mari kita juga membuat pengguna / grup yang tepat, seperti some/graphite
gambar.
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
VOLUME /data/graphite
USER graphite
CMD ["/bin/bash"]
Anda dapat membuat KERING ini dengan mewarisi dari some/graphite
atau some/graphitedata
di Dockerfile, atau alih-alih membuat gambar baru gunakan kembali salah satu yang sudah ada (menimpa entrypoint / cmd seperlunya).
Sekarang, Anda cukup menjalankan:
docker run -ti --rm --volumes-from=graphitedata some/graphitetools
dan kemudian vi /data/graphite/whatever.txt
. Ini berfungsi dengan baik karena semua kontainer memiliki pengguna grafit yang sama dengan uid / gid yang cocok.
Karena Anda tidak pernah me-mount /data/graphite
dari host, Anda tidak peduli bagaimana host uid / gid memetakan ke uid / gid yang didefinisikan di dalam graphite
dan graphitetools
kontainer. Kontainer tersebut sekarang dapat digunakan untuk host mana saja, dan mereka akan terus bekerja dengan sempurna.
Hal yang rapi tentang ini adalah bahwa graphitetools
bisa memiliki semua jenis utilitas dan skrip yang bermanfaat, yang kini dapat Anda gunakan secara portabel.
UPDATE 2 : Setelah menulis jawaban ini, saya memutuskan untuk menulis posting blog yang lebih lengkap tentang pendekatan ini. Saya harap ini membantu.
UPDATE 3 : Saya memperbaiki jawaban ini dan menambahkan lebih spesifik. Sebelumnya berisi beberapa asumsi yang salah tentang kepemilikan dan perms - kepemilikan biasanya diberikan pada waktu pembuatan volume yaitu dalam wadah data, karena saat itulah volume dibuat. Lihat blog ini . Ini bukan persyaratan - Anda hanya dapat menggunakan wadah data sebagai "referensi / pegangan" dan mengatur kepemilikan / perms dalam wadah lain melalui chown di entri point, yang berakhir dengan gosu untuk menjalankan perintah sebagai pengguna yang benar. Jika ada yang tertarik dengan pendekatan ini, silakan komentar dan saya dapat memberikan tautan ke sampel menggunakan pendekatan ini.