Запуск оболочки в контейнере Docker Alpine

165

Чтобы запустить интерактивную оболочку для образа Ubuntu, мы можем запустить:

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

Но когда это выполняется для образа Alpine Docker , получаются следующие результаты:

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

Что такое команда для запуска интерактивной оболочки в базовом контейнере Alpine?

Ole
источник

Ответы:

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

Опции, использованные выше:

  • /bin/ashЭш ( Almquist Shell ) предоставлен BusyBox
  • --rmАвтоматически удалять контейнер при выходе ( docker run --help)
  • -i Интерактивный режим (держать STDIN открытым, даже если он не подключен)
  • -t Выделить псевдо-TTY
Ole
источник
1
Конечно, хорошая идея - пепел - это оболочка, а --rm удаляет контейнер после завершения цикла. Поэтому, если вы хотите, чтобы контейнер оставался доступным после запуска, пропустите использование --rm. Я использую его, так как я только экспериментирую с банкоматом.
Оле
Тогда как запустить его с помощью свойства detach, как Ubuntu?
Беньямин Лиманто
Я верю в обоих случаях ... Ubuntu или Alpine ... вы просто даете ему -dвозможность.
Оле
2
+1 за то, что заметил, что у Alpine есть, ashа что нет bash, что, будучи не очень знакомым с Alpine, это то, что заставило меня и помешало мне получить доступ к контейнеру раньше.
code_dredd
Если вы находитесь на RHEL и получаете ошибку отказа в разрешении, это снова SELinux ... должен временно сделать это setenforce 0: P
Parth Patel
67

Обычно, Alpine Linux образ не содержит bash, Вместо этого вы можете использовать /bin/ash, /bin/sh, ashили только sh.

/ Бен / зола

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

/ Бен / ш

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

ясень

docker run -it --rm alpine ash

ш

docker run -it --rm alpine sh

Я надеюсь, что эта информация поможет вам.

jansanchez
источник
1
В чем разница между /bin/ashи ash? Похоже на /bin/shа sh.
Питер Мортенсен
1
Привет @ peter-mortensen, разница в том, что ashэто только символическая ссылка на /bin/ash. Некоторые дистрибутивы Linux не имеют символических ссылок.
января 18
28

В настоящее время образы Alpine будут загружаться напрямую /bin/shпо умолчанию, без указания оболочки для выполнения:

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

Это , так как alpineизображение Dockerfiles теперь содержит в CMDкоманде, что определяет оболочку для выполнения при запуске контейнера: CMD ["/bin/sh"].

В более старых версиях образов Alpine (до 2017 года) команда CMD не использовалась, поскольку Docker использовал для создания дополнительного слоя для CMD, что приводило к увеличению размера изображения. Это то, чего разработчики Alpine хотели избежать. В последних версиях Docker (1.10+) CMD больше не занимает слой, поэтому он был добавлен в alpineизображения. Следовательно, до тех пор, пока CMD не будет переопределен, будут загружаться последние образы Alpine /bin/sh.

Для справки см. Следующую фиксацию в официальных альпийских файлах докеров Glider Labs:
https://github.com/gliderlabs/docker-alpine/commit/ddc19dd95ceb3584ced58be0b8d7e9169d04c7a3#diff-db3dfdee92c17cf53a9655b49

Вальяно
источник
4

Если контейнер уже запущен:

docker exec -it container_id_or_name ash
Marcos
источник