Senha raiz dentro de um contêiner Docker

265

Estou usando uma imagem do Docker que foi criada usando o comando USER para usar um usuário não raiz chamado dev. Dentro de um contêiner, sou "dev", mas quero editar o /etc/hostsarquivo.

Então eu preciso ser raiz. Estou tentando o comando su, mas sou solicitado a inserir a senha root.

Qual é a senha do usuário root padrão dentro de um contêiner do Docker?

guillaume
fonte
11
apenas exec como raiz: docker exec -u 0 -it mycontainer bash. (veja H6a resposta)
Sławomir Lenart

Respostas:

495

Você pode efetuar login no contêiner do Docker usando o usuário raiz (ID = 0) em vez do usuário padrão fornecido ao usar a -uopção Por exemplo

docker exec -u 0 -it mycontainer bash

root (id = 0) é o usuário padrão em um contêiner. O desenvolvedor de imagens pode criar usuários adicionais. Esses usuários são acessíveis por nome. Ao passar um ID numérico, o usuário não precisa existir no contêiner.

da documentação do Docker

H6
fonte
5
Seria bom especificar que você precisa do meu contêiner em funcionamento no momento em que digita a vírgula acima. funciona usando 2 terminais diferentes: um para o mycontainer e outro para este comando. Caso contrário, ele exige que o mycontainer esteja sendo executado como desanexado.
Nicolimo86
6
para imagens, usedocker run -u 0 -it mycontainer bash
Pavel 'PK' Kaminsky
2
esta é a resposta que deve estar no topo
D Pinto
1
@ High6, quando você diz "Você pode efetuar login na imagem do Docker ...", acho que você quer dizer "Você pode fazer login no contêiner do Docker ".
Lmiguelvargasf
Isso é sempre possível? Ou isso pode ser bloqueado?
Sam Thomas
82

Por fim, decidi reconstruir minhas imagens do Docker, para alterar a senha de root por algo que saberei.

RUN echo 'root:Docker!' | chpasswd

ou

RUN echo 'Docker!' | passwd --stdin root 
guillaume
fonte
5
Eu tentei isso, mas ele não funciona na minha janela de encaixe CentOS 6. Este comando funciona na janela de encaixe baseada no CentOS?
Dragan Nikolic
28

Existem algumas maneiras de fazer isso.

  1. Para executar o Docker, substituindo a configuração USER

    docker exec -u 0 -it containerName bash
    

ou

docker exec -u root -it --workdir / <containerName> bash
  1. Faça as permissões de arquivo necessárias, etc., durante a criação da imagem no arquivo Docker

  2. Se todos os pacotes estiverem disponíveis na sua imagem do Linux, chpasswdno dockerfile antes do utilitário USER.

Muralidharan.rade
fonte
23

Consigo fazê-lo funcionar com o comando abaixo.

root@gitnew:# docker exec -it --user $(username) $(containername) /bin/bash
Mansur Ali
fonte
18

Eu tinha exatamente esse problema de não conseguir fazer o root porque estava executando no contêiner como um usuário não privilegiado.

Mas eu não queria reconstruir uma nova imagem, como sugerem as respostas anteriores.

Em vez disso, descobri que podia acessar o contêiner como root usando o 'nsenter', consulte: https://github.com/jpetazzo/nsenter

Primeiro determine o PID do seu contêiner no host:

docker inspect --format {{.State.Pid}} <container_name_or_ID>

Em seguida, use o nsenter para inserir o contêiner como root

nsenter --target <PID> --mount --uts --ipc --net --pid
Richard Corfield
fonte
1
Usando boot2docker, eu tive que usar #sudo nsenter --target <PID> --mount --uts --ipc --net --pid
peater
Sim, bom argumento. Você geralmente precisa de permissões de root para executar comandos do docker e acho que o nsenter é o mesmo. Não deixei isso totalmente claro na minha resposta.
precisa
4
Desde que esta resposta foi escrita, o docker adicionou o comando exec para fazer basicamente o mesmo que o nsenter, mas mais fácil e limpo. Apenas um ponto de dados para quem agora encontra essa pergunta através da pesquisa. O comando é "docker exec -it <containername> <command>" (o comando geralmente é / bin / bash, mas é claro que você pode fazer o que quiser).
Kevin Keane
Além disso, o docker possui tratamento especial para hosts (e resolv.conf). Você não deve editá-los manualmente; O docker recria / etc / hosts a cada início para refletir contêineres vinculados e similares.
Kevin Keane
18
docker exec -u 0 -it containername bash
user128364
fonte
9

Obtenha um shell do seu contêiner em execução e altere a senha root:

docker exec -it <MyContainer> bash

root@MyContainer:/# passwd
Enter new UNIX password:
Retype new UNIX password:
DimiDak
fonte
9

Para criar / alterar uma senha root em um contêiner em execução

docker exec -itu root {containerName} passwd
Proximo
fonte
5

A senha é 'ubuntu' para o usuário 'ubuntu' (pelo menos no docker para ubuntu: 14.04.03).

NB: 'ubuntu' é criado após a inicialização do contêiner, portanto, se você fizer isso:

 docker run -i -t --entrypoint /bin/bash  ubuntu     

Você receberá o prompt raiz diretamente. A partir daí, você pode forçar a alteração da senha do root, confirmar o contêiner e, opcionalmente, marcá-lo (com -f) para o ubuntu: latest como este:

root@ec384466fbbb:~# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@ec384466fbbb:~# exit

% docker commit ec3844
5d3c03e7d6d861ce519fe33b184cd477b8ad03247ffe19b2a57d3f0992d71bca

docker tag -f 5d3c ubuntu:latest

Você deve reconstruir suas dependências eventuais no ubuntu: latest.

user1853859
fonte
3

Sugiro que uma solução melhor seja fornecer o --add-host NAME:IPargumento para executar o docker ao iniciar o contêiner. Isso atualizará o /etc/hosts/arquivo sem a necessidade de se tornar root.

Caso contrário, você pode substituir a USERconfiguração dando o -u USERsinalizador para docker run. No entanto, eu desaconselharia isso, pois você não deveria realmente mudar as coisas em um contêiner em execução. Em vez disso, faça as alterações em um Dockerfile e crie uma nova imagem.

Adrian Mouat
fonte
Preciso adicionar entradas no arquivo hosts enquanto o contêiner estiver em execução.
guillaume
Também preciso instalar um novo pacote, mas não posso, pois não sou root.
guillaume
1
Você pode usar o -usinalizador para alterar o usuário. Eu não acho que você pode fazer isso de dentro do contêiner.
Adrian Mouat
2

Você pode usar o comando raiz USER em seu Dockerfile.

naveen kumar
fonte
2

Ao iniciar o contêiner, você será root, mas não saberá o que é o pw da raiz. Para configurá-lo para algo que você conhece, basta usar "passwd root". Faça uma captura instantânea / confirme o contêiner para salvar suas ações.

JohnBabrick
fonte
1

Por padrão, os contêineres do docker são executados como o root usuário.

Se você ainda estiver usando o contêiner, poderá usar o exitcomando para voltar aoroot usuário (usuário padrão) em vez de executá-lo novamente.

Exemplo -

[dev@6c4c86bccf93 ~]$ ls
[dev@6c4c86bccf93 ~]$ other-commands..
[dev@6c4c86bccf93 ~]$ exit
[root@6c4c86bccf93 /]# ls
Mithilesh Tipkari
fonte
0

tente o seguinte comando para obter o acesso root

$ sudo -i 
Abhishek DK
fonte
É improvável que funcione, a menos que você tenha a conta na configuração do contêiner com acesso ao sudo. Essa seria uma situação incomum e quebraria o ponto de ter um usuário não raiz executando o contêiner.
Josiah
Alguém sabe a senha su padrão para a instalação do Docker? Eu tentei executar a elevação e há um conjunto.
Patrick Burwell
Isso funcionou no WSL2 após exportar a imagem do docker e importar para o WSL2. A partir daí, basta fazer o passwd para definir a senha para root. Volte para o usuário não root e tente sudo su ou su. Agora vai funcionar.
WSLUser
0

Em alguns casos, você precisa ser capaz de fazer coisas assim com um usuário sudo(por exemplo, o aplicativo em execução no contêiner fornece um shell aos usuários). Basta adicionar isso ao Dockerfile:

RUN apt-get update         # If necessary
RUN apt-get install sudo   # If your base image does not contain sudo.
RUN useradd -m -N -s /bin/bash -u 1000 -p '$1$miTOHCYy$K.c4Yw.edukWJ7z9rbpTZ0' user && \
    usermod -aG sudo user  # Grant sudo to the user
USER user

Agora, no usuário de imagem padrão, uservocê poderásudo a senha definida na linha 3.

Veja como gerar o hash da senha useradd aqui ou aqui .

greatvovan
fonte