在Docker Alpine容器中启动shell

246

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

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

4个回答

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

上述使用的选项:

  • /bin/ash 是由BusyBox提供的Ash (Almquist Shell)
  • --rm 自动在退出时删除容器 (docker run --help)
  • -i 交互模式(即使未附加,仍保持标准输入打开)
  • -t 分配一个伪终端

2
当然 - 很好的想法 - ash 是 shell,而 --rm 则会在运行完成后移除容器。所以,如果你希望在运行后仍然可以使用该容器,则跳过使用 --rm。我目前只是在进行实验,因此正在使用它。 - Ole
那么如何像Ubuntu一样使用分离属性来运行它呢? - Benyamin Limanto
我相信在这两种情况下...无论是Ubuntu还是Alpine...您只需给它一个“-d”选项即可。 - Ole
6
谢谢您指出Alpine使用的是ash而不是bash。由于我对Alpine不太熟悉,这让我之前无法访问容器。+1 - code_dredd
如果你在RHEL上遇到了权限被拒绝的错误,那么很可能是SELinux又出问题了...暂时得执行setenforce 0命令 :P - Parth Patel

98

通常,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

sh

docker run -it --rm alpine sh

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


1
/bin/ashash有什么区别?/bin/shsh同理。 - Peter Mortensen
2
嗨@peter-mortensen,区别在于ash只是符号链接到/bin/ash。有些Linux发行版没有符号链接。 - jansanchez

46

现今,Alpine镜像将默认直接引导到/bin/sh,无需指定要执行的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 Dockerfiles 的以下提交:
https://github.com/gliderlabs/docker-alpine/commit/ddc19dd95ceb3584ced58be0b8d7e9169d04c7a3#diff-db3dfdee92c17cf53a96578d4900cb5b


39

如果容器已经在运行:

docker exec -it container_id_or_name ash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接