在 Docker Alpine 容器中启动一个 shell



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

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

上面使用的选项:

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

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

/

垃圾桶/灰

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

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

如今,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 创建额外的层,从而导致映像大小增加。这是阿尔卑斯图像开发人员想要避免的事情。在最近的Docker版本(1.10+)中,CMD不再占用一层,因此它被添加到alpine映像中。因此,只要CMD没有被覆盖,最近的Alpine图像就会启动到/bin/sh

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

如果容器已经在运行:

docker exec -it container_id_or_name ash

相关内容

  • 没有找到相关文章

最新更新