Saya harus melewati opsi --user
untuk menjalankan wadah yang diatur di bawah UID saya sendiri. Ini sebagian besar karena volume Host yang dipasang, dan saya ingin aplikasi buruh pelabuhan menghasilkan file yang saya miliki, bukan root.
Dengan docker-compose up
, ini tidak mungkin, setidaknya tidak secara langsung. Saat ini saya menggunakan solusi gila:
NAME=`compose run -d --user="$UID" someservicename`
docker rename $NAME ${NAME/_run/}
yang suboptiomal, bersikap lembut.
Saya tidak yakin saya mengerti, docker-compose run --user
adalah opsi, dan docker-compose.yml
mendukung kunci user
(http://docs.docker.com/compose/yml/ #working95dir-entrypoint-user-hostname-domainname-mem95limit-privileged-restart-stdin95open-tty-cpu95shares).
Saya kira kita perlu mendukung resolusi variabel lingkungan di bidang user
sehingga Anda dapat mengaturnya ke $UID
benar? #1377
Hai. Ya, ekspansi $UID
akan berhasil dalam kasus ini. Namun, opsi --user
docker-compose up
untuk perintah docker-compose up (tidak hanya untuk docker-compose run
) akan berguna untuk memulai keseluruhan proyek sebagai pengguna tertentu.
Intinya adalah untuk memungkinkan menentukan pengguna tanpa menyentuh yml.
mulai seluruh proyek sebagai pengguna tertentu
Tidak pernah terpikir oleh saya bahwa orang mungkin ingin melakukan ini. Bisakah Anda menguraikan kasus penggunaan?
Tidak apa-apa, saya menggulir ke atas. Apakah saya benar dalam berpikir Anda menggunakan Linux? Saat menggunakan boot2docker itu membuat file dengan izin yang masuk akal.
Saya ingin tahu apakah ada cara untuk mengonfigurasi daemon Docker untuk melakukan ini untuk setiap volume yang dipasang.
Ya, di Linux.
Saya menggunakan compose untuk menjalankan tes pada CI dengan memasang volume Host (ya, saya tahu). Tanpa opsi ini, beberapa file dibuat dengan kepemilikan "salah", yaitu root:root
Saya tahu saya bisa menggunakan wadah data saja dan memeriksa/menyalin file darinya, tetapi volume Host jauh lebih nyaman dan membutuhkan lebih sedikit skrip.
up --user
bisa berbahaya jika beberapa kontainer/layanan sudah menentukan pengguna.
@mrzechonek Saya tidak berpikir bahwa memodifikasi wadah karena lingkungannya adalah praktik yang baik.
@josefpage ya, mungkin saja. Ekspansi $UID akan berhasil.
Cukup banyak satu-satunya hal yang saya butuhkan adalah izin yang tepat pada volume host. Saya tidak tahu cara lain untuk mencapainya, selain menjalankan proses container sebagai $UID...
Saya sebenarnya lebih suka fitur ini hadir di Damon itu sendiri, seperti kata @aanand . Atau mungkin opsi untuk memasang volume dalam mode seperti itu (driver penyimpanan mungkin?).
@mrzechonek , sudahkah Anda menemukan solusi?
Tidak benar-benar, tidak. Saat ini kami sedang melakukan docker-compose run --user
dan kemudian mengganti nama/melabel ulang wadah untuk membuat compose
berpikir itu dimulai dengan perintah up
, sehingga stop
dan ps
akan berhasil.
user: $UID
di docker-compose.yml
. Jika Anda merasa nyaman menggunakan master, Anda dapat mencobanya sekarang, jika tidak, rilis RC akan tersedia dalam beberapa minggu ke depan.Saya akan menutup masalah ini karena fitur itu sendiri diimplementasikan sebagai bagian dari #1377
dan kemudian ganti nama/label ulang wadah untuk membuat penulisan berpikir itu dimulai dengan perintah atas
Ini sebenarnya bukan pertama kalinya saya mendengar perlunya ini (walaupun dalam hal ini saya kira itu hanya sementara). Saya memiliki usulan perbaikan untuk itu di # 2042
Terima kasih, #1377 memperbaiki ini dengan baik.
@mrzechonek Bisakah Anda menjelaskan bagaimana ini menyelesaikan masalah Anda? Saya memiliki kasus penggunaan yang sama persis: "Saya ingin aplikasi buruh pelabuhan menghasilkan file milik saya, bukan root"
Saya mencoba menambahkan user: $UID
ke wadah web
dan ketika saya menggunakan docker-compose run web touch foo
saya mendapatkan yang berikut:
WARNING: The UID variable is not set. Defaulting to a blank string.
File foo
telah dibuat, tetapi masih dimiliki oleh root
.
Saya telah menggunakan user: $USER
, tetapi $UID
juga berfungsi. Saya tidak tahu mengapa pengaturan Anda mengeluh tentang variabel yang hilang :(
Memiliki masalah yang sama persis dengan @michaelmior.
Saat menggunakan $USER sebagai gantinya saya mendapatkan System error: Unable to find user Max
. Yang masuk akal karena ini adalah pengguna host.
Apa yang dapat menyebabkan $UID tidak tersedia selama eksekusi docker-compose?
Hai, masalah yang sama di sini.
Saya menggunakan Fedora 23, dan variabel UID tidak disebarkan ketika saya memanggil perintah env
pada Host.
solusi:
lakukan export UID
pada host terlebih dahulu, lalu panggil docker-compose
Anda
Akan lebih baik jika docker-compose hanya membuat $UID
tersedia tanpa harus diekspor. Akhirnya menjadi boilerplate.
Jika UID
tidak diekspor, tidak ada cara untuk menulis untuk mendapatkannya, jadi saya pikir apa yang Anda minta tidak mungkin.
Jadi buat hanya karena aplikasi yang sedang berjalan tidak memiliki cara untuk menyimpulkan pengguna yang dijalankannya?
Tentu, itu bisa membaca variabel lingkungan $USER
, tetapi Anda juga bisa melakukannya dari file Compose! Jika variabel tidak diekspor, itu tidak akan tersedia untuk proses anak. Solusi yang sangat mudah tampaknya hanya mengekspornya.
Saya lebih berpikir bahwa jika UID tidak dideklarasikan, maka yang dapat dieksekusi dapat melihat uid yang menjalankannya dan membuatnya tersedia seperti itu.
Sekali lagi, pikirkan tentang boilerplate dan langkah-langkah yang mudah diabaikan. Kebanyakan orang menginginkan pengaturan di mana satu-satunya langkah adalah docker-compose up
. Mengapa menambahkan satu persyaratan variabel kecil bahwa 99% orang akan mengatur semuanya dengan cara yang persis sama.
Apakah ada sumber bagus yang menjelaskan gotcha serupa lainnya antara host Mac dan Linux?
Juga, memaksa pengguna bukanlah yang kami inginkan di Linux, kami menginginkan perilaku yang dimiliki Mac, di mana bahkan ketika Anda menjalankan sebagai root dalam wadah, file baru pada volume Host memiliki izin yang berguna :(
Saya sebenarnya hanya bingung mengapa perilaku Mac saya lebih baik daripada perilaku Linux saya, dan itu tidak sepenuhnya terkait dengan masalah ini. Saya memulai masalah pada Dinghy untuk mencari solusi untuk pengalaman yang menyenangkan di Linux.
@mrzechonek dapatkah Anda membagikan bagaimana Anda menggunakan direktif user:
untuk memastikan izin file sudah benar di Host dan wadah?
Saya cukup menambahkan user: $UID
ke dalam file .yml
. Itu di Linux, Gentoo dan Ubuntu 12.04.
@mrzechonek terima kasih. Apakah wadah Anda kemudian melakukan keajaiban waktu berjalan? Sejauh yang saya mengerti, user:
mencerminkan instruksi Dockerfile. Tapi itu berarti bahwa perintah di dalam wadah dijalankan sebagai user: $UID
. Saya tidak dapat memahami bagaimana itu membantu dengan izin volume =/.
@mrzechonek : Ini berbeda. Kami ingin fitur untuk mengontrol pengguna yang bertindak sebagai wadah, di luar sistem host, terlepas dari siapa yang diatur sebagai di dalam wadah itu sendiri.
Pikirkan: _" root
dalam wadah menulis sebagai myuser
pengguna di Host"_.
Dalam kasus penggunaan kami, hampir selalu pengguna yang sama membangun wadah dan menjalankannya, jadi tidak ada masalah.
Namun, jika Anda ingin memetakan pengguna kontainer untuk meng-host pengguna "secara dinamis", saya pikir satu-satunya cara untuk melakukannya adalah dengan mendukung ruang nama pengguna LXC di daemon buruh pelabuhan itu sendiri, fitur yang belum diterapkan (belum? tahu?).
Saya tidak berpikir itu sesuatu yang bisa dilakukan docker-compose
.
Sepertinya saya melewatkan beberapa rilis: https://integratedcode.us/2015/10/13/user-namespaces-have-arrived-in-docker/
Maaf, saya tidak menggunakan Docker lagi, setidaknya tidak aktif dalam proyek saat ini.
Terima kasih @mrzechonek. Pada akhirnya, saya mencoba melakukan apa yang coba dilakukan @gkop -- minta file yang dihasilkan oleh container pada volume yang dipasang di host yang dimiliki oleh container starter. Begitulah cara kerjanya di OS X dengan Docker 1.12 beta terbaru (bagaimana?) dan saya juga ingin melihatnya di linux.
@mrzechonek - Beberapa aplikasi mengharuskan mereka dijalankan sebagai pengguna tertentu, atau mengharuskan pengguna yang mereka jalankan sebagai peta ke yang asli di sistem. Dalam kasus tersebut, lebih mudah untuk membiarkannya sebagai root dan melakukan pemetaan di atas kepala wadah.
(ini sebagai pengganti banyak peretasan jelek untuk memetakan skema pengguna sistem yang berjalan saat ini ke dalam wadah hanya untuk membuat semuanya berbaris)
@dmitrym0 Saya pikir di bawah OSX, Anda menjalankan boot2docker
di dalam virtualisasi OSX asli (https://github.com/mist64/xhyve/) dan kemudian wadah dibuat di dalam VM itu. Ini berarti bahwa itu benar-benar VM yang melakukan semua pemetaan pengguna, bukan daemon buruh pelabuhan. root
root
.
$UID tidak disetel secara default pada host Ubuntu 16.04. Akan sepele bagi docker-compose untuk mendapatkan id pengguna yang menjalankannya dan tetap menyuntikkannya. Jauh lebih sedikit kode boilerplate dan pengaturan lingkungan untuk pengguna pembuatan aplikasi dev, yang masuk akal karena penulisan adalah tentang UX buruh pelabuhan.
+1 untuk docker-compose up --user atau pengguna pelaksana ....
Apakah ada solusi atau berita tentang masalah ini?
Tidak, dan saya membuka fitur ini terhadap mesin buruh pelabuhan beberapa waktu yang lalu: https://github.com/docker/docker/issues/22415
Saya pikir ini adalah masalah dampak yang jauh lebih tinggi daripada yang diakui saat ini. Mampu mengubah pengguna apa yang disentuh wadah sistem file tanpa harus membuat wadah itu sendiri mengetahui sistem izin akan membuka beberapa pintu.
Jika ini adalah sesuatu yang Anda minati, saya sarankan untuk membagikan dan memilih tiket yang saya tautkan.
ini bekerja untuk saya: user: "1000:1000"
@jovanialferez FYI jika Anda melakukan hardcode seperti itu, Anda akan mengalami masalah jika orang lain terlibat dalam proyek yang tidak memiliki UID dan GID yang disetel ke 1000. Saya pikir OSX mulai menomori pengguna biasa pada 500, dan Linux apa pun menginstal dengan banyak pengguna akan berakhir dengan UID lebih besar dari 1000.
@jovanialferez yang hanya akan bekerja di Linux.
dicatat. terima kasih @nfm @luispabon
Saya baru saja pindah dari Mac ke Linux dan baru saja terkena ini, tidak begitu mengerti bagaimana ini belum terpecahkan
Menyebutkan masalah ini lagi sehingga pendatang baru melihatnya: https://github.com/moby/moby/issues/22415
Kami benar-benar membutuhkan kemampuan untuk memetakan proses buruh pelabuhan secara eksternal ke pengguna tertentu. Penekanan pada eksternal . Tidak memilih UID/GID dari proses dalam wadah. Tetapi petakan proses penampung ke UID/GID lokal dari luar.
Ya memang. Menetapkan uid/gid pengguna saat ini ke dalam wadah hanya berfungsi di Linux. Sepertinya masalah buruh pelabuhan.
Kami mengalami masalah yang lebih esoteris di Windows. Kami menggunakan instance lokal OrientDB, yang menulis file ke sistem file host, dan pada Windows sepertinya tidak melakukannya. Oh... mungkin karena volume host tidak blok volime?
Hampir satu tahun yang lalu ketika saya mencoba untuk menyelesaikan ini saya menemukan topik ini. Karena tidak ada solusi yang diberikan pada saat itu, saya membuat banyak skrip bash pembungkus untuk menjalankan docker-compose.
Sekarang setelah satu tahun semuanya sama. Saya bertanya-tanya berapa banyak waktu yang diperlukan untuk menyelesaikan masalah sederhana seperti itu untuk perangkat lunak seperti docker-compose yang bahkan bukan penyedia nyata melainkan pembungkus.
$UID tidak diekspor di Linux secara default, oke? Ini mencegah kami membuat komposisi buruh pelabuhan universal - yang merupakan hal aneh dengan sendirinya karena perangkat lunak ini dianggap sebagai solusi front-end, bukan?
Jika kalian tidak suka membuang waktu untuk hal-hal sepele - dan saya mengerti itu - lalu mengapa Anda tidak membiarkan kami menjalankan perintah host acak sebelum menjalankan layanan, ya? Kami hanya bisa melakukan sesuatu seperti ini:
services:
web:
...
host_command: export UID
Bukankah itu jelas?
+1
Masalah ini tidak memiliki cukup suka dan +1 dan bagi saya itu diabaikan namun dibutuhkan dan diminta oleh banyak pengguna termasuk saya sendiri.
Saya di sini untuk memberikan +1 saya juga karena saya terkena ini. Saat ini saya tidak ingin wadah saya berjalan sebagai root -belum- Saya ingin mereka berbagi volume di Host yang dapat ditulisi oleh pengguna saya. Ini tidak dapat dilakukan jika saya tidak mengatur pengguna dan perluasan akan menjadi cara paling alami untuk melakukan ini daripada user: 1000:1000
karena, seperti yang dinyatakan sebelumnya, ini akan menyebabkan konflik dengan pengguna dengan lingkungan lain. $UID, meskipun tidak diekspor, terbukti menjadi solusi yang lebih baik karena berbasis lingkungan daripada berbasis docker-exppose.
Hanya 2 sen saya. Jadi, adakah yang menemukan cara untuk melakukan ini?
@darkguy2008 - Pastikan untuk meningkatkan yang ini: https://github.com/moby/moby/issues/22415
Saya menduga sebuah fitur akan dibutuhkan di dalam buruh pelabuhan itu sendiri sebelum penulisan dapat dibangun di atasnya.
Saya tidak yakin saya mengerti,
docker-compose run --user
adalah opsi, dandocker-compose.yml
mendukung kunciuser
(http://docs.docker.com/compose/yml/ #working95dir-entrypoint-user-hostname-domainname-mem95limit-privileged-restart-stdin95open-tty-cpu95shares).Saya kira kita perlu mendukung resolusi variabel lingkungan di bidang
user
sehingga Anda dapat mengaturnya ke$UID
benar? #1377
Tautannya rusak.
Menemukan bahwa menambahkan variabel wajib membantu sebagai solusi:
version: "3"
services:
testapp:
image: ubuntu:20.04
entrypoint: /bin/bash -c "cd $PWD && touch tmp"
user: ${CURRENT_UID:?"Please run as follows 'CURRENT_UID=$(id -u):$(id -g) docker-compose up'"}
volumes:
- $PWD:$PWD
Akan menunjukkan:
ERROR: Missing mandatory value for "user" option in service "testapp": "Please run as follows 'CURRENT_UID=$(id -u):$(id -g) docker-compose up'"
Menentukan bahwa file harus dieksekusi seperti ini:
CURRENT_UID=$(id -u):$(id -g) docker-compose up
Menemukan bahwa menambahkan variabel wajib membantu sebagai solusi:
version: "3" services: testapp: image: ubuntu:20.04 entrypoint: /bin/bash -c "cd $PWD && touch tmp" user: ${CURRENT_UID:?"Please run as follows 'CURRENT_UID=$(id -u):$(id -g) docker-compose up'"} volumes: - $PWD:$PWD
Akan menunjukkan:
ERROR: Missing mandatory value for "user" option in service "testapp": "Please run as follows 'CURRENT_UID=$(id -u):$(id -g) docker-compose up'"
Menentukan bahwa file harus dieksekusi seperti ini:
CURRENT_UID=$(id -u):$(id -g) docker-compose up
Masalahnya adalah bahwa layanan saya memerlukan akses root
untuk memulai. Misalnya:
app-php-fpm | [14-Jun-2020 00:15:12] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
app-php-fpm | [14-Jun-2020 00:15:12] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root
app-redis | 1:M 14 Jun 2020 00:15:12.710 * Ready to accept connections
app-php-fpm | [14-Jun-2020 00:15:12] ERROR: Unable to create the PID file (/run/php-fpm.pid).: Permission denied (13)
app-php-fpm | [14-Jun-2020 00:15:12] ERROR: FPM initialization failed
app-webserver exited with code 1
app-mysql exited with code 1
app-php-fpm exited with code 78
Komentar yang paling membantu
Hampir satu tahun yang lalu ketika saya mencoba untuk menyelesaikan ini saya menemukan topik ini. Karena tidak ada solusi yang diberikan pada saat itu, saya membuat banyak skrip bash pembungkus untuk menjalankan docker-compose.
Sekarang setelah satu tahun semuanya sama. Saya bertanya-tanya berapa banyak waktu yang diperlukan untuk menyelesaikan masalah sederhana seperti itu untuk perangkat lunak seperti docker-compose yang bahkan bukan penyedia nyata melainkan pembungkus.
$UID tidak diekspor di Linux secara default, oke? Ini mencegah kami membuat komposisi buruh pelabuhan universal - yang merupakan hal aneh dengan sendirinya karena perangkat lunak ini dianggap sebagai solusi front-end, bukan?
Jika kalian tidak suka membuang waktu untuk hal-hal sepele - dan saya mengerti itu - lalu mengapa Anda tidak membiarkan kami menjalankan perintah host acak sebelum menjalankan layanan, ya? Kami hanya bisa melakukan sesuatu seperti ini:
Bukankah itu jelas?