Bagaimana cara menggunakan sudo di dalam wadah buruh pelabuhan?

259

Biasanya, kontainer buruh pelabuhan dijalankan menggunakan root pengguna . Saya ingin menggunakan pengguna lain, yang tidak masalah menggunakan arahan USER buruh pelabuhan. Tetapi pengguna ini harus bisa menggunakan sudo di dalam wadah. Perintah ini tidak ada.

Berikut Dockerfile sederhana untuk tujuan ini:

FROM ubuntu:12.04

RUN useradd docker && echo "docker:docker" | chpasswd
RUN mkdir -p /home/docker && chown -R docker:docker /home/docker

USER docker
CMD /bin/bash

Menjalankan wadah ini, saya bisa masuk dengan pengguna 'buruh pelabuhan'. Ketika saya mencoba menggunakan sudo, perintah tidak ditemukan. Jadi saya mencoba menginstal paket sudo di dalam Dockerfile saya menggunakan

RUN apt-get install sudo

Ini menghasilkan Tidak dapat menemukan paket sudo

drubb
sumber
Berikan saja grup sudo ke pengguna. askubuntu.com/questions/7477/…
Regan

Jawaban:

242

Baru saja mendapatkannya. Seperti yang ditunjukkan regan, saya harus menambahkan pengguna ke grup sudoers. Tapi alasan utamanya adalah saya lupa memperbarui cache repositori, jadi apt-get tidak bisa menemukan paket sudo. Ini bekerja sekarang. Ini kode yang sudah lengkap:

FROM ubuntu:12.04

RUN apt-get update && \
      apt-get -y install sudo

RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo

USER docker
CMD /bin/bash
drubb
sumber
8
tidak bekerja dalam centos. yang adduserperintah meludah keluar penggunaan bantuan untukuseradd
Emad
Untuk CentOS, Anda bisa menambahkan pengguna dan grup, lalu buat file shard di bawah /etc/sudoers.d/dan atur izin 440pada file itu. Maka pengguna akan memiliki akses sudo di bawah CentOS, 6 dan lebih tinggi. 5 Anda harus menambahkan #includedir /etc/sudoers.darahan di/etc/sudoers
FilBot3
Tidak bekerja untuk saya. Saya memiliki kesalahan itu: E: Tidak dapat membuka file kunci / var / lib / apt / daftar / kunci - terbuka (13: Izin ditolak) E: Tidak dapat mengunci direktori / var / lib / apt / daftar /
Marosinho
1
Ini sepertinya tidak berfungsi untuk gambar docker Ubuntu 18.04
viggy
100

Ketika sudo atau apt-get tidak tersedia dalam wadah, Anda juga dapat melompat ke menjalankan wadah sebagai pengguna root menggunakan perintah

docker exec -u root -t -i container_id /bin/bash
Tomáš Záluský
sumber
Ini adalah solusi yang jauh lebih baik untuk apa yang OP mungkin ingin capai, meskipun jawaban yang diterima memberikan solusi yang diminta. Paling tidak, itu jawaban yang saya cari!
spikyjt
79

Jawaban lain tidak berhasil untuk saya. Saya terus mencari dan menemukan posting blog yang membahas bagaimana tim menjalankan non-root di dalam wadah buruh pelabuhan.

Inilah versi TL; DR:

RUN apt-get update \
 && apt-get install -y sudo

RUN adduser --disabled-password --gecos '' docker
RUN adduser docker sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

USER docker

# this is where I was running into problems with the other approaches
RUN sudo apt-get update 

Saya menggunakan FROM node:9.3ini, tetapi saya menduga bahwa basis wadah serupa lainnya akan bekerja juga.

M. Scott Ford
sumber
Saya menggunakan ubuntu:bionic-20180724.1. Saya menggunakan pendekatan ini tetapi, setelah di atas, itu tidak memungkinkan saya untuk menginstal paket lain. Saya ditambahkan satu baris ke atas Dockerfileuntuk menginstal paket dengan: RUN apt-get install -y tree. Namun, itu memberi saya pesan kesalahan ini:Step xxxx/xxxx : RUN apt-get install -y tree ---> Running in j5e6gsvwfafa Reading package lists... E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied) E: Unable to lock directory /var/lib/apt/lists/
edesz
1
@WR Saya pikir Anda perlu mengubah baris itu untuk membaca RUN sudo apt-get install -y tree. Setelah mengatur USERsesuatu selain root, Anda harus menggunakan sudoperintah apa pun yang memerlukan roothak istimewa.
M. Scott Ford
Ah terima kasih! Melewatkan itu. Saya tidak berpikir sudodiizinkan di Dockerfile.
edesz
Sempurna, hanya apa yang saya butuhkan.
Arin Ekandem
25

Untuk siapa pun yang memiliki masalah ini dengan wadah yang sudah berjalan, dan mereka tidak selalu ingin membangun kembali, perintah berikut ini terhubung ke wadah yang berjalan dengan hak akses root:

docker exec -ti -u root container_name bash

Anda juga dapat terhubung menggunakan ID-nya, bukan dari namanya, dengan menemukannya dengan:

docker ps -l

Untuk menyimpan perubahan Anda sehingga masih ada di sana saat Anda meluncurkan wadah berikutnya (atau klaster penyusun dok):

docker commit container_id image_name

Untuk memulai wadah yang tidak berjalan dan terhubung sebagai root:

docker run -ti -u root --entrypoint=/bin/bash image_id_or_name -s

Untuk menyalin dari wadah yang sedang berjalan:

docker cp <containerId>:/file/path/within/container /host/path/target

Untuk mengekspor salinan gambar:

docker save container | gzip > /dir/file.tar.gz

Yang dapat Anda pulihkan ke pemasangan Docker lain menggunakan:

gzcat /dir/file.tar.gz | docker load

Ini jauh lebih cepat tetapi membutuhkan lebih banyak ruang untuk tidak memampatkan, menggunakan:

docker save container | dir/file.tar

Dan:

cat dir/file.tar | docker load
Chris
sumber
17

jika Anda ingin terhubung ke wadah dan menginstal sesuatu
menggunakan apt-get
pertama seperti jawaban di atas dari saudara kami "Tomáš Záluský"

docker exec -u root -t -i container_id /bin/bash

lalu coba

RUN pembaruan apt-get atau apt-get 'apa pun yang Anda inginkan'

itu berhasil dengan saya harap ini berguna untuk semua

Ismail
sumber
5

Jika SUDO atau apt-get tidak dapat diakses di dalam Container, Anda dapat menggunakan, opsi di bawah ini dalam menjalankan container.

docker exec -u root -it f83b5c5bf413 ash

" f83b5c5bf413" adalah ID kontainer saya & inilah contoh yang berfungsi dari terminal saya:

masukkan deskripsi gambar di sini

Yogi Ghorecha
sumber
3

Inilah cara saya mengatur pengguna non-root dengan gambar dasar ubuntu:18.04:

RUN \
    groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
    sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
    echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "Customized the sudoers file for passwordless access to the foo user!" && \
    echo "foo user:";  su - foo -c id

Apa yang terjadi dengan kode di atas:

  • Pengguna dan grup foodibuat.
  • Pengguna fooditambahkan ke grup foodan sudo.
  • The uiddan giddiatur ke nilai 999.
  • Direktori rumah diatur ke /home/foo.
  • Shell diatur ke /bin/bash.
  • The sedperintah melakukan update inline dengan /etc/sudoersberkas untuk memungkinkan foodan rootakses pengguna memasukkan password ke sudokelompok.
  • The sedperintah menonaktifkan #includedirdirektif yang akan memungkinkan file dalam subdirektori untuk menimpa update inline ini.
Seth Bergman
sumber
2

Jika Anda memiliki wadah yang dijalankan sebagai root yang menjalankan skrip (yang tidak dapat Anda ubah) yang membutuhkan akses ke sudoperintah, Anda bisa membuat sudoskrip baru di Anda $PATHyang memanggil perintah yang diteruskan.

mis. Di Dockerfile Anda:

RUN if type sudo 2>/dev/null; then \ 
     echo "The sudo command already exists... Skipping."; \
    else \
     echo -e "#!/bin/sh\n\${@}" > /usr/sbin/sudo; \
     chmod +x /usr/sbin/sudo; \
    fi
Kesederhanaan Xtra
sumber
1
Tergantung pada gambar buruh pelabuhan yang Anda gunakan (dalam kasus saya Ubuntu: 18.04), Anda mungkin perlu menghapus -edari echo. Kalau tidak, file itu akan ada dalam file itu sendiri, menjadikannya tidak berfungsi.
stiller_leser
Gagasan rapi, tetapi ini tidak akan berfungsi jika perintah asli menggunakan opsi sudo, seperti sudo -E ls. Itu akan mencoba untuk mengeksekusi -E ls.
wisbucky
2

Ini mungkin tidak berfungsi untuk semua gambar, tetapi beberapa gambar sudah berisi pengguna root, seperti pada gambar jupyterhub / pengguna tunggal. Dengan gambar itu hanya:

USER root
RUN sudo apt-get update
Alex Kaszynski
sumber
1

Gunakan Alias.

alias sudo=''

Sederhana namun efisien. Jangan lupa menambahkannya ke ~ / .bash_aliases sehingga akan berfungsi setelah Anda membuka shell baru.

nano ~/.bash_aliases
alias sudo=''
#(Ctrl+X)

Karena pengguna adalah root default di Docker, 'mengabaikan' perintah sudo adalah cara termudah.

Dogkiller87
sumber
0

Tidak seperti jawaban yang diterima , saya menggunakan usermodsebagai gantinya.

Asumsikan sudah masuk sebagai root di buruh pelabuhan, dan "buah" adalah nama pengguna baru non-root yang ingin saya tambahkan, cukup jalankan perintah ini:

apt update && apt install sudo
adduser fruit
usermod -aG sudo fruit

Ingatlah untuk menyimpan gambar setelah pembaruan. Gunakan docker psuntuk mendapatkan <docker CONTAINER ID> dan <IMAGE> saat ini, kemudian jalankan docker commit -m "added sudo user" <CONTAINER ID> <IMAGE>untuk menyimpan gambar buruh pelabuhan.

Kemudian uji dengan:

su fruit
sudo whoami

Atau uji dengan login langsung (pastikan simpan gambar dulu) sebagai pengguna non-root saat meluncurkan buruh pelabuhan:

docker run -it --user fruit <IMAGE>
sudo whoami

Anda dapat menggunakannya sudo -kuntuk menyetel ulang stempel waktu kata sandi:

sudo whoami # No password prompt
sudo -k # Invalidates the user's cached credentials
sudo whoami # This will prompt for password
Buah
sumber