Normalmente, os contêineres do docker são executados usando a raiz do usuário . Eu gostaria de usar um usuário diferente, o que não é problema ao usar a diretiva USER do docker. Mas esse usuário deve poder usar o sudo dentro do contêiner. Este comando está ausente.
Aqui está um Dockerfile simples para esse fim:
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
Ao executar este contêiner, eu entrei com o usuário 'docker'. Quando tento usar o sudo, o comando não é encontrado. Então, tentei instalar o pacote sudo dentro do meu Dockerfile usando
RUN apt-get install sudo
Isso resulta em Não foi possível localizar o pacote sudo
docker
sudo
linux-containers
drubb
fonte
fonte
Respostas:
Apenas entendi. Como regan apontou, eu tive que adicionar o usuário ao grupo sudoers. Mas o principal motivo foi que eu tinha esquecido de atualizar o cache dos repositórios, então o apt-get não conseguiu encontrar o pacote sudo. Está funcionando agora. Aqui está o código completo:
fonte
adduser
comando cuspe a ajuda de uso parauseradd
/etc/sudoers.d/
e definir as permissões440
nesse arquivo. Em seguida, o usuário teria acesso ao sudo no CentOS, 6 ou superior. 5 você precisará adicionar a#includedir /etc/sudoers.d
diretiva em/etc/sudoers
Quando nem sudo nem apt-get estão disponíveis no contêiner, você também pode pular para o contêiner em execução como usuário root usando o comando
fonte
As outras respostas não funcionaram para mim. Continuei pesquisando e encontrei uma postagem no blog que abordava como uma equipe estava executando não-root dentro de um contêiner de docker.
Aqui está a versão TL; DR:
Eu estava usando
FROM node:9.3
para isso, mas suspeito que outras bases de contêineres semelhantes funcionariam também.fonte
ubuntu:bionic-20180724.1
. Usei essa abordagem, mas, após o exposto, ela não me permite instalar outro pacote. Eu anexada uma linha para a acimaDockerfile
, a fim de instalar um pacote com:RUN apt-get install -y tree
. No entanto, ele me deu esta mensagem de erro: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/
RUN sudo apt-get install -y tree
. Depois de definirUSER
para algo diferente deroot
, você precisará usarsudo
para qualquer comando que exijaroot
privilégios.sudo
foi permitido em um arquivo Docker.Para quem tem esse problema com um contêiner já em execução e não deseja necessariamente reconstruir, o comando a seguir se conecta a um contêiner em execução com privilégios de root:
Você também pode se conectar usando seu ID, em vez de seu nome, localizando-o com:
Para salvar suas alterações para que elas ainda estejam lá quando você iniciar o próximo contêiner (ou cluster de docker-componha):
Para iniciar um contêiner que não está em execução e conectar-se como root:
Para copiar de um contêiner em execução:
Para exportar uma cópia da imagem:
Que você pode restaurar para outra instalação do Docker usando:
É muito mais rápido, mas ocupa mais espaço para não compactar, usando:
E:
fonte
se você deseja se conectar ao container e instalar algo
usando o apt-get
first, como resposta acima do nosso irmão "Tomáš Záluský"
então tente
funcionou comigo espero que seja útil para todos
fonte
Se SUDO ou apt-get não estiver acessível dentro do contêiner, você pode usar a opção abaixo na execução de contêiner.
" f83b5c5bf413" é o meu ID de contêiner e aqui está um exemplo de trabalho do meu terminal:
fonte
Veja como eu configuro um usuário não root com a imagem base de
ubuntu:18.04
:O que acontece com o código acima:
foo
são criados.foo
é adicionado ao grupofoo
esudo
.uid
egid
é definido como o valor de999
./home/foo
./bin/bash
.sed
comando faz atualizações embutidas no/etc/sudoers
arquivo para permitirfoo
eroot
aos usuários acesso sem senha aosudo
grupo.sed
comando desativa a#includedir
diretiva que permitiria que qualquer arquivo nos subdiretórios substituísse essas atualizações embutidas.fonte
Se você tiver um contêiner em execução como root que executa um script (que não pode ser alterado) que precisa de acesso ao
sudo
comando, basta criar um novosudo
script$PATH
que chame o comando passado.Por exemplo, no seu Dockerfile:
fonte
-e
-lo doecho
. Caso contrário, ele estará presente no próprio arquivo, tornando-o infuncional.sudo -E ls
. Ele tentará executar-E ls
.Isso pode não funcionar para todas as imagens, mas algumas imagens já contêm um usuário raiz, como na imagem jupyterhub / singleuser. Com essa imagem é simplesmente:
fonte
Use Alias.
Simples, mas eficiente. Não se esqueça de anexá-lo a ~ / .bash_aliases, para que ele funcione depois que você abrir um novo shell.
Como o usuário é a raiz padrão no Docker, 'ignorar' o comando sudo é a maneira mais fácil.
fonte
Ao contrário da resposta aceita , eu uso
usermod
.Suponha que você já tenha efetuado login como root na janela de encaixe e "fruit" seja o novo nome de usuário não raiz que quero adicionar, basta executar estes comandos:
Lembre-se de salvar a imagem após a atualização. Use
docker ps
para obter o <CONTAINER ID> e <IMAGE> dodocker commit -m "added sudo user" <CONTAINER ID> <IMAGE>
docker em execução, e execute para salvar a imagem do docker.Depois teste com:
Ou teste por login direto (assegure-se de salvar a imagem primeiro) como esse usuário não raiz ao iniciar a janela de encaixe:
Você pode usar
sudo -k
para redefinir o carimbo de data / hora do prompt de senha:fonte