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.