231

要为 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 的命令是什么?

4

4 回答 4

390
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
于 2016-02-28T23:29:08.587 回答
90

通常,Alpine Linux 映像不包含,bash而是您可以使用/bin/ash、或仅./bin/shashsh

/bin/灰

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

/bin/sh

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

docker run -it --rm alpine ash

docker run -it --rm alpine sh

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

于 2017-04-22T20:22:31.337 回答
43

如今,Alpine 镜像默认会直接启动/bin/sh,无需指定 shell 来执行:

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

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

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

有关参考,请参阅 Glider Labs 对官方 Alpine Dockerfiles 的以下提交:
https ://github.com/gliderlabs/docker-alpine/commit/ddc19dd95ceb3584ced58be0b8d7e9169d04c7a3#diff-db3dfdee92c17cf53a96578d4900cb5b

于 2019-02-01T12:18:01.713 回答
29

如果容器已经在运行:

docker exec -it container_id_or_name ash
于 2020-03-19T20:20:07.280 回答