Compose: Mendukung opsi --user di "docker-compose up"

Dibuat pada 9 Jun 2015  ·  53Komentar  ·  Sumber: docker/compose

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.

areconfig

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:

services:
  web:
     ...
     host_command: export UID

Bukankah itu jelas?

Semua 53 komentar

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.

1377 dalam master dan akan berada dalam rilis 1.5.0, jadi Anda akan dapat melakukan 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, 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

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
Apakah halaman ini membantu?
0 / 5 - 0 peringkat