关于linux:在Docker Alpine容器中启动shell

Starting a shell in the Docker Alpine container

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

1
2
3
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映像运行此命令时,将得到以下结果:

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

在Alpine基本容器中启动交互式Shell的命令是什么?


1
2
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


通常,Alpine Linux映像不包含bash,而是可以使用/bin/ash/bin/shash或仅使用sh

/ bin /灰

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

/ bin / sh

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

1
docker run -it --rm alpine ash

SH

1
docker run -it --rm alpine sh

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


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

1
2
3
$ 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


如果容器已经在运行:

1
docker exec -it container_id_or_name ash