在Docker Alpine容器中启动Shell


165

要为Ubuntu映像启动交互式shell,我们可以运行:

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基本容器中启动交互式Shell的命令是什么?

Answers:


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

上面使用的选项:

  • /bin/ash是BusyBox提供的Ash(Almquist Shell)。
  • --rm退出时自动移除容器(docker run --help
  • -i 交互模式(即使未连接,也请保持STDIN打开)
  • -t 分配伪TTY

1
当然-好主意-灰是外壳,运行完成后--rm除去容器。因此,如果您希望容器在运行后仍然可用,请跳过--rm的使用。我正在使用它,因为我只是在试验ATM。
2016年

然后如何使用ubuntu这样的detach属性运行它?
Benyamin Limanto

我相信在两种情况下... Ubuntu或Alpine ...您只要给它一个-d选择即可。
Ole

2
+1表示Alpine拥有ash和不拥有,而Alpine bash并不十分熟悉,这是吸引我的原因,并阻止了我更早地访问容器。
code_dredd

如果您在RHEL上并获得权限被拒绝错误,那又是SELinux……必须暂时设置setenforce 0:P
Parth Patel

67

通常情况下,高山Linux映像不包含bash,相反,你可以使用/bin/ash/bin/shash或只sh

/ bin /灰

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

/ bin / sh

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

docker run -it --rm alpine ash

SH

docker run -it --rm alpine sh

希望这些信息对您有所帮助。


1
/bin/ash和之间有什么区别ash?与/bin/sh和类似sh
彼得·莫滕森

1
@ peter-mortensen,您好,不同之处在于 ash只是到的符号链接 /bin/ash。某些Linux发行版没有符号链接。
jansanchez

28

如今,/bin/sh默认情况下,Alpine映像将直接启动,而无需指定要执行的shell:

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

这是因为alpine镜像Dockerfile现在包含一个CMD命令,该命令指定了在容器启动时要执行的shell : CMD ["/bin/sh"]

在较旧的Alpine映像版本(2017之前)中,未使用CMD命令,因为Docker曾为CMD创建一个额外的层,这导致映像大小增加。这是Alpine图片开发人员想要避免的事情。在最新的Docker版本(1.10+)中,CMD不再占据一层,因此已将其添加到alpine映像中。因此,只要不覆盖CMD,最近的Alpine映像都将启动/bin/sh

作为参考,请参阅Glider Labs对官方Alpine Dockerfile的以下承诺:https :
//github.com/gliderlabs/docker-alpine/commit/ddc19dd95ceb3584ced58be0b8d7e9169d04c7a3#diff-db3dfdee92c17cf53a96578d4900cb5b


4

如果容器已经在运行:

docker exec -it container_id_or_name ash
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.