Bagaimana cara Docker COPY sebagai bukan root?

143

Saat membangun gambar Docker, bagaimana cara saya COPYfile ke dalam gambar sehingga file yang dihasilkan dimiliki oleh pengguna selain root?

FGreg
sumber

Jawaban:

206

Untuk versi v17.09.0-ce dan yang lebih baru

Gunakan bendera opsional --chown=<user>:<group>dengan perintah ADDatau COPY.

Sebagai contoh

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

Dokumentasi untuk flag --chown sekarang ditampilkan langsung di halaman Referensi Dockerfile utama .

Masalah 34263 telah digabungkan dan tersedia dalam rilis v17.09.0-ce .


Untuk versi yang lebih lama dari v17.09.0-ce

Docker tidak mendukung COPYsebagai pengguna selain root. Anda perlu chown/ chmodfile setelah itu COPYperintah.

Contoh Dockerfile:

from centos:6
RUN groupadd -r myuser && adduser -r -g myuser myuser
USER myuser
#Install code, configure application, etc...
USER root
COPY run-my-app.sh /usr/local/bin/run-my-app.sh
RUN chown myuser:myuser /usr/local/bin/run-my-app.sh && \
    chmod 744 /usr/local/bin/run-my-app.sh
USER myuser
ENTRYPOINT ["/usr/local/bin/run-my-app.sh"]

Sebelum v17.09.0-ce, Dockerfile Reference untuk COPYperintah tersebut mengatakan:

Semua file dan direktori baru dibuat dengan UID dan GID 0.


Sejarah Fitur ini telah dilacak melalui beberapa masalah GitHub: 6119 , 9943 , 13600 , 27303 , 28499 , Edisi 30110 .

Masalah 34263 adalah masalah yang mengimplementasikan fungsionalitas flag opsional dan Edisi 467 memperbarui dokumentasi.

FGreg
sumber
3
Ini menyebalkan, karena chown-ing banyak file telah menjadi sangat lambat sejak overlay2 telah menjadi driver penyimpanan default
hbogert
1
Yap, selain itu, ia menciptakan lapisan gambar ekstra besar tanpa alasan yang jelas (dalam kasus saya:> 300MB untuk berjalan chownpada 40MB file).
Dirk
Ada satu manfaat juga untuk menjalankan chown bersama dengan perintah COPY yaitu pengurangan ukuran. Jika kita menjalankan kedua perintah secara terpisah (COPY <host_path> <source_path>; chown other_user: other_user) maka itu menciptakan satu lapisan tambahan yang akhirnya menggandakan ukuran gambar.
abhishek thakur
Jawaban ini adalah penyelamat. Terima kasih banyak, memecahkan masalah yang telah saya perjuangkan selama beberapa jam.
Colby Hill