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

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

上述选项:

  • /bin/ash是BusyBox提供的Ash (Almquist Shell)
  • --rm当容器退出时自动移除容器(docker run --help)
  • -i交互模式(保持STDIN打开,即使没有附加)
  • 分配一个伪tty

通常,一个Alpine Linux映像不包含bash,相反,你可以使用/bin/ash/bin/shash或只使用sh

/bin/ash

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

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

现在,默认情况下,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 < / p >

如果容器已经在运行:

docker exec -it container_id_or_name ash