Dock konteynerinin içinde sudo nasıl kullanılır?


260

Normalde, docker kapları kullanıcı kökü kullanılarak çalıştırılır . Docker'in USER yönergesini kullanırken sorun olmayan farklı bir kullanıcı kullanmak istiyorum. Ancak bu kullanıcı konteyner içinde sudo kullanabilmelidir . Bu komut eksik.

İşte bu amaç için basit bir Dockerfile:

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

Bu kapsayıcıyı çalıştırdığımda, 'docker' kullanıcısıyla giriş yapıyorum. Sudo kullanmaya çalıştığımda, komut bulunamadı. Bu yüzden kullanarak sudo paketini Dockerfile'ımın içine yüklemeye çalıştım

RUN apt-get install sudo

Bu sudo paketi bulunamıyor


Sadece sudo grubunu kullanıcıya verin. askubuntu.com/questions/7477/…
— Regan

Yanıtlar:


242

Sadece anladım. Regan'ın işaret ettiği gibi, kullanıcıyı sudoers grubuna eklemek zorunda kaldım. Ama asıl nedeni, depo önbelleğini güncellemeyi unutmuş olmamdı, bu yüzden apt-get sudo paketini bulamadı. Şuan çalışıyor. Tamamlanan kod:

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

8
centos'ta çalışmıyor. adduserKomut kullanım yardım için tükürüruseradd
— Emad

CentOS için, bir kullanıcı ve grup ekleyebilir, ardından altında bir parça dosyası oluşturabilir /etc/sudoers.d/ve 440bu dosyadaki izinleri ayarlayabilirsiniz . Daha sonra kullanıcı CentOS, 6 ve üstü altında sudo erişimine sahip olacaktır. 5 #includedir /etc/sudoers.dDirektifi eklemek zorundasınız/etc/sudoers
— FilBot3

Benim için çalışmıyor. Bu hatalar var: E: Kilit dosyası açılamadı / var / lib / apt /
— Lists

1
Bu Ubuntu 18.04 liman işçisi görüntü için çalışmıyor gibi görünüyor
— viggy

100

Kapta ne sudo ne de apt-get yoksa, komutu kullanarak çalışan kapsayıcıya root kullanıcısı olarak atlayabilirsiniz.

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

Bu, kabul edilen cevap istenen çözümü vermesine rağmen, OP'nin muhtemelen elde etmek istediği şey için çok daha iyi bir çözümdür. En azından aradığım cevap bu!
— spikyjt

80

Diğer cevaplar benim için işe yaramadı. Aramaya devam ettim ve bir ekibin liman işçisinin konteynerinin içinde kök dışı çalışmasını kapsayan bir blog yazısı buldum .

İşte TL; DR versiyonu:

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 

Bunun için kullanıyordum FROM node:9.3, ancak diğer benzer konteyner tabanlarının da çalışacağından şüpheleniyorum.


Kullanıyorum ubuntu:bionic-20180724.1. Bu yaklaşımı kullandım, ancak yukarıdakilerden sonra başka bir paket kurmama izin vermiyor. İle Dockerfilebir paket yüklemek için yukarıdakilere bir satır ekledim RUN apt-get install -y tree. Ancak, bana bu hata iletisini verdi: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 Okumak için bu satırı değiştirmeniz gerektiğini düşünüyorum RUN sudo apt-get install -y tree. USERÖğesini başka bir şeye ayarladıktan sonra root, ayrıcalık sudogerektiren komutlar için kullanmanız gerekir root.
— M. Scott Ford

Ah teşekkürler! Bunu kaçırdım. Ben düşünmüyordu sudobir Dockerfile içinde izin verildi.
— edesz

Mükemmel, tam ihtiyacım olan şey.
— Arin Ekandem

25

Zaten çalışan bir kapsayıcıyla bu sorunu yaşayan ve yeniden oluşturmak istemeyen herkes için, aşağıdaki komut kök ayrıcalıklarına sahip çalışan bir kapsayıcıya bağlanır:

docker exec -ti -u root container_name bash

Ayrıca, adını bulmak yerine kimliğini kullanarak bağlantı kurabilirsiniz:

docker ps -l

Kapsayıcıyı (veya docker-compose kümesini) bir sonraki başlatışınızda değişikliklerin hala orada olacak şekilde kaydetmek için:

docker commit container_id image_name

Çalışmayan bir kapsayıcı başlatmak ve kök olarak bağlanmak için:

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

Çalışan bir kaptan kopyalamak için:

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

Görüntünün bir kopyasını dışa aktarmak için:

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

Aşağıdakileri kullanarak başka bir Docker kurulumuna geri yükleyebilirsiniz:

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

Çok daha hızlıdır, ancak sıkıştırmamak için daha fazla alan kullanır:

docker save container | dir/file.tar

Ve:

cat dir/file.tar | docker load

17

Eğer konteyner bağlamak ve
apt-get kullanarak
yukarıdaki bir şey yüklemek istiyorsanız kardeşimizden "Tomáš Záluský"

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

o zaman dene

Apt-get güncellemesini ÇALIŞTIR veya 'istediğiniz her şeyi' apt-get

benimle çalıştı umut herkes için yararlı


5

Eğer SUDO ya apt-get Konteyner içerisindeki erişilebilir değil, sen konteyner çalışan seçeneğinin altındaki kullanabilirsiniz.

docker exec -u root -it f83b5c5bf413 ash

" f83b5c5bf413" kapsayıcı kimliğimdir ve burada terminalimden çalışan bir örnek var:

resim açıklamasını buraya girin


3

Kök olmayan bir kullanıcıyı aşağıdaki temel görüntüyle nasıl kurarım 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

Yukarıdaki kodla ne olur:

  • Kullanıcı ve grup foooluşturulur.
  • Kullanıcı foo, hem ilave edilir foove sudogrup.
  • uidVe giddeğerine ayarlanır 999.
  • Giriş dizini olarak ayarlanır /home/foo.
  • Kabuk olarak ayarlanır /bin/bash.
  • sedKomut satır içi güncellemeler yapar /etc/sudoerssağlaması için dosya foove rootkullanıcıların şifresiz erişim sudogrubunda.
  • sedKomut devre dışı bırakır #includedirbu satır içi güncellemelerini geçersiz kılmak için alt dizinlerinde tüm dosyaları sağlayacak direktifini.

2

sudoKomuta erişmesi gereken bir komut dosyasını çalıştıran (değiştiremeyeceğiniz) kök olarak çalışan bir kapsayıcı varsa , iletilen komutta çağrılan yeni bir sudokomut dosyası oluşturabilirsiniz $PATH.

Örneğin Dockerfile dosyasında:

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

1
(Benim durumumda Ubuntu içinde: 18.04) Kullandığınız liman işçisi görüntüleri bağlı olarak, kaldırmak gerekebilir -edan echo. Aksi takdirde dosyanın kendisinde bulunarak işlevsiz hale gelir.
— stiller_leser

Düzgün bir fikir, ancak orijinal komut gibi sudo seçenekleri kullanıyorsa, bu çalışmaz sudo -E ls. Yürütmeye çalışacaktır -E ls.
— wisbucky

2

Bu, tüm görüntüler için çalışmayabilir, ancak bazı görüntüler jupyterhub / singleuser görüntüsü gibi bir kök kullanıcı içerir. Bu görüntü ile basitçe:

USER root
RUN sudo apt-get update

1

Takma Ad kullanın.

alias sudo=''

Basit ama etkili. ~ / .Bash_aliases öğesine eklemeyi unutmayın, böylece yeni bir kabuk açtıktan sonra çalışacaktır.

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

Kullanıcı Docker'da varsayılan kök olduğundan , sudo komutunu 'yoksaymak' en kolay yoldur.


0

Kabul edilen cevabın aksine ben kullanıyorum usermod.

Docker'da zaten kök olarak oturum açtığınızı ve "meyve" eklemek istediğim yeni kök olmayan kullanıcı adı olduğunu varsayalım, sadece bu komutları çalıştırın:

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

Güncellemeden sonra görüntüyü kaydetmeyi unutmayın. docker psÇalışmakta olan liman işçisinin <CONTAINER ID> ve <IMAGE> öğelerini almak için kullanın , ardından docker commit -m "added sudo user" <CONTAINER ID> <IMAGE>liman işleyici görüntüsünü kaydetmek için çalıştırın .

Ardından aşağıdakilerle test edin:

su fruit
sudo whoami

Veya docker'ı başlattığında kök olmayan kullanıcı olarak doğrudan giriş yaparak test edin (önce resmi kaydettiğinizden emin olun):

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

sudo -kŞifre istemi zaman damgasını sıfırlamak için kullanabilirsiniz :

sudo whoami # No password prompt
sudo -k # Invalidates the user's cached credentials
sudo whoami # This will prompt for password
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.