Iniciando um shell no contêiner Docker Alpine

165

Para iniciar um shell interativo para a imagem do Ubuntu, podemos executar:

ole@T:~$ docker run -it --rm ubuntu
root@1a6721e1fb64:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

Mas quando isso é executado para a imagem do Alpine Docker , os seguintes resultados:

ole@T:~$ docker run -it --rm alpine
Error response from daemon: No command specified

Qual é o comando para iniciar um shell interativo em um contêiner base Alpine?

Ole
fonte

Respostas:

282
ole@T:~$ docker run -it --rm alpine /bin/ash
(inside container) / # 

Opções usadas acima:

  • /bin/ashé Ash ( Almquist Shell ) fornecida pela BusyBox
  • --rmRemover automaticamente o contêiner ao sair ( docker run --help)
  • -i Modo interativo (mantenha o STDIN aberto mesmo se não estiver conectado)
  • -t Alocar um pseudo-TTY
Ole
fonte
1
Claro - boa idéia - ash é a concha e --rm remove o contêiner após a conclusão da execução. Portanto, se você deseja que o contêiner ainda esteja disponível após a execução, pule o uso de --rm. Estou usando, já que estou experimentando apenas caixas eletrônicos.
Ole
Então, como executá-lo com desanexar propriedades como o ubuntu?
Benyamin Limanto 5/02/19
Eu acredito em ambos os casos ... Ubuntu ou Alpine ... você apenas dá uma -dopção.
05519 Ole
2
+1 por observar que a Alpine possui ashe não bash, o que, por não estar muito familiarizado com a Alpine, foi o que me pegou e me impediu de acessar o contêiner mais cedo.
code_dredd
Se você estiver em RHEL e obter permissão negada erro, é SELinux de novo ... tem que fazer isso setenforce 0 temporariamente: P
Parth Patel
67

Normalmente, uma imagem Alpine Linux não contém bash, Em vez disso você pode usar /bin/ash, /bin/sh, ashou única sh.

/ bin / ash

docker run -it --rm alpine /bin/ash

/ bin / sh

docker run -it --rm alpine /bin/sh

cinza

docker run -it --rm alpine ash

sh

docker run -it --rm alpine sh

Espero que esta informação o ajude.

jansanchez
fonte
1
Qual é a diferença entre /bin/ashe ash? Semelhante para /bin/she sh.
Peter Mortensen
1
Olá @ peter-mortensen, a diferença é que ashé apenas um link simbólico para /bin/ash. Algumas distribuições linux não possuem links simbólicos.
jansanchez
28

Atualmente, as imagens do Alpine são inicializadas diretamente /bin/shpor padrão, sem a necessidade de especificar um shell para executar:

$ sudo docker run -it --rm alpine  
/ # echo $0  
/bin/sh  

Isto é porque os alpineDockerfiles imagem agora contêm um CMDcomando, que especifica o shell para executar quando o recipiente começa: CMD ["/bin/sh"].

Nas versões mais antigas da imagem Alpine (antes de 2017), o comando CMD não era usado, pois o Docker criava uma camada adicional para o CMD, o que fazia com que o tamanho da imagem aumentasse. Isso é algo que os desenvolvedores de imagens da Alpine queriam evitar. Nas versões recentes do Docker (1.10 ou superior), o CMD não ocupa mais uma camada e foi adicionado às alpineimagens. Portanto, desde que o CMD não seja substituído, imagens alpinas recentes serão inicializadas /bin/sh.

Para referência, consulte o seguinte commit dos Alpine Dockerfiles da Glider Labs:
https://github.com/gliderlabs/docker-alpine/commit/ddc19dd95ceb3584ced58be0b8d7e9169d04c7a3#diff-db3dfdee92c17cf53a96578b4900

valiano
fonte
4

Caso o contêiner já esteja em execução:

docker exec -it container_id_or_name ash
Marcos
fonte