Démarrer un shell dans le conteneur Docker Alpine

165

Pour démarrer un shell interactif pour l'image Ubuntu, nous pouvons exécuter:

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

Mais lorsque cela est exécuté pour l' image Alpine Docker , les résultats suivants:

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

Quelle est la commande pour démarrer un shell interactif dans un conteneur de base Alpine?

Ole
la source

Réponses:

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

Options utilisées ci-dessus:

  • /bin/ashest Ash ( Almquist Shell ) fourni par BusyBox
  • --rmRetirer automatiquement le conteneur à sa sortie ( docker run --help)
  • -i Mode interactif (garder STDIN ouvert même s'il n'est pas connecté)
  • -t Attribuer un pseudo-TTY
Ole
la source
1
Bien sûr - bonne idée - ash est le shell et --rm supprime le conteneur une fois l'exécution terminée. Donc, si vous voulez que le conteneur soit toujours disponible après l'exécution, ignorez l'utilisation de --rm. Je l'utilise car je n'essaye que l'ATM.
Ole
Alors comment l'exécuter avec une propriété detach comme ubuntu?
Benyamin Limanto
Je crois que dans les deux cas ... Ubuntu ou Alpine ... vous lui donnez juste une -doption.
Ole
2
+1 pour avoir noté qu'Alpine l'a fait ashet non bash, ce qui, n'étant pas très familier avec Alpine, est ce qui m'a attiré et m'a empêché d'accéder au conteneur plus tôt.
code_dredd
Si vous êtes sur RHEL et que vous obtenez une erreur d'autorisation refusée, c'est à nouveau SELinux ... je dois faire cela setenforce 0 temporairement: P
Parth Patel
67

En général, une image Linux Alpine ne contient pas bash, au lieu que vous pouvez utiliser /bin/ash, /bin/sh, ashou seulement sh.

/ bin / ash

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

/ bin / sh

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

cendre

docker run -it --rm alpine ash

sh

docker run -it --rm alpine sh

J'espère que ces informations vous aideront.

jansanchez
la source
1
Quelle est la différence entre /bin/ashet ash? Similaire pour /bin/shet sh.
Peter Mortensen
1
Salut @ peter-mortensen, la différence est que ce ashn'est qu'un lien symbolique vers /bin/ash. Certaines distributions Linux n'ont pas de liens symboliques.
jansanchez
28

De nos jours, les images Alpine démarreront directement /bin/shpar défaut, sans avoir à spécifier un shell à exécuter:

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

Ceci est depuis les alpineimages Dockerfiles contiennent maintenant une CMDcommande, qui spécifie le shell à exécuter lorsque le conteneur commence: CMD ["/bin/sh"].

Dans les anciennes versions d'image Alpine (avant 2017), la commande CMD n'était pas utilisée, car Docker avait l'habitude de créer une couche supplémentaire pour CMD, ce qui entraînait une augmentation de la taille de l'image. C'est quelque chose que les développeurs d'images d'Alpine voulaient éviter. Dans les versions récentes de Docker (1.10+), CMD n'occupe plus une couche et a donc été ajouté aux alpineimages. Par conséquent, tant que CMD n'est pas écrasé, les images alpines récentes démarreront /bin/sh.

Pour référence, voir le commit suivant sur les fichiers officiels Alpine Docker de Glider Labs:
https://github.com/gliderlabs/docker-alpine/commit/ddc19dd95ceb3584ced58be0b8d7e9169d04c7a3#diff-db3dfdee92c17cf53a965bd

Valiano
la source
4

Dans le cas où le conteneur est déjà en cours d'exécution:

docker exec -it container_id_or_name ash
Marcos
la source