Bagaimana cara menambahkan file ke wadah buruh pelabuhan yang tidak memiliki izin root?

16

Saya mencoba menambahkan file ke gambar Docker yang dibuat dari tomcatgambar resmi . Gambar itu tampaknya tidak memiliki hak root, karena saya masuk sebagai pengguna tomcatjika saya menjalankan bash:

docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$ 

Jika saya menginstruksikan Dockerfileuntuk menyalin file ke wadah itu, file tersebut memiliki izin 644dan pemiliknya root. Sejauh yang saya mengerti, itu tampaknya masuk akal karena semua perintah di Dockerfile dijalankan sebagai root. Namun, jika saya mencoba mengubah kepemilikan file itu tomcat:tomcat, saya mendapatkan Operation not permittedkesalahan.

Mengapa saya tidak bisa mengubah izin file yang disalin ke gambar itu?

Bagaimana bisa direproduksi:

mkdir docker-addfilepermission
cd docker-addfilepermission
touch test.txt
echo 'FROM tomcat
COPY test.txt /usr/local/tomcat/webapps/
RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfile

docker build .

Output dari docker build .:

Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM tomcat
 ---> 44859847ef64
Step 1 : COPY test.txt /usr/local/tomcat/webapps/
 ---> Using cache
 ---> a2ccb92480a4
Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt
 ---> Running in 208e7ff0ec8f
chown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted
2014/11/01 00:30:33 The command [/bin/sh -c chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt] returned a non-zero code: 1
nyi
sumber

Jawaban:

20

Mungkin ada cara untuk melihat dan mengubah Dockerfile untuk kucing jantan, tapi saya tidak bisa mengetahuinya setelah beberapa menit. Solusi saya yang salah adalah menambahkan baris ini sebelum chown:

USER root

Jika Anda ingin menghilangkan hak istimewa setelah (yang disarankan), Anda dapat menambahkan baris ini:

USER tomcat

Bergantian, bekerja dengan gambar yang tidak memiliki perangkat lunak yang diinstal sehingga Anda dapat memulai Dockerfile Anda sebagai root dan instal kucing jantan dan semua itu. Sebenarnya aneh mereka mengubah gambar mereka dari pengalaman saya. Masuk akal untuk mengizinkan pengguna akhir yang diinginkan untuk mengatur arahan USER sesuai keinginan mereka.

theterribletrivium
sumber
Ini memang berhasil! Apakah Anda tahu secara kebetulan mengapa perintah ADD dan COPY membuat file dengan pemilik root? Mengapa mereka tidak mempertimbangkan USERpetunjuknya?
nyi
1
Yah, biasanya Anda tidak melihat gambar dasar yang mengatur arahan, karena tidak ada cara nyata untuk mengetahui akun pengguna apa yang akan ada di sistem. Mungkin juga lebih mudah untuk membuat file dibuat sebagai root karena Docker harus menjalankannya. Sepertinya permintaan peningkatan yang masuk akal, itu akan menyederhanakan membangun Dockerfiles jika hal-hal dapat secara otomatis dimiliki oleh apa yang ditetapkan dalam direktif USER.
theterribletrivium
Terima kasih. Sungguh, keluarkan aku dari kesengsaraan. Saya perlu menambahkan kunci ssh dalam gambar Jenkins.
Kostas Demiris
8

Karena Docker 17.09 orang dapat menggunakan --chownflag pada operasi ADD / COPY di Dockerfile untuk mengubah pemilik dalam langkah ADD / COPY itu sendiri daripada operasi RUN terpisah dengan chown yang meningkatkan ukuran gambar seperti yang telah Anda catat. Akan lebih baik untuk memiliki ini sebagai mode default yaitu izin pengguna menyalin file diterapkan ke file yang disalin. Namun, tim Docker tidak ingin merusak kompatibilitas dan karenanya memperkenalkan bendera baru.

COPY --chown=<user>:<group> <hostPath> <containerPath>

Alternatif lain adalah:

  1. Ubah izin dalam folder pementasan sebelum membangun gambar.
  2. Jalankan wadah melalui skrip bootstrap yang mengubah kepemilikan.
  3. Squash the layers!
Vinayak Gadkari
sumber