在 Docker Alpine 容器中启动 shell

Posted

技术标签:

【中文标题】在 Docker Alpine 容器中启动 shell【英文标题】:Starting a shell in the Docker Alpine container 【发布时间】:2016-06-11 21:45:11 【问题描述】:

要为 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 image运行时,结果如下:

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

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

【问题讨论】:

【参考方案1】:
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

【讨论】:

当然 - 好主意 - ash 是外壳, --rm 在运行完成后删除容器。因此,如果您希望容器在运行后仍然可用,请跳过 --rm 的使用。我正在使用它,因为我只是在试验 ATM。 那么如何使用 ubuntu 之类的 detach 属性运行呢? 我相信在这两种情况下......Ubuntu或Alpine......你只需给它一个-d选项。 +1 表示 Alpine 有 ash 而不是 bash,由于对 Alpine 不是很熟悉,这让我无法更早地访问容器。 如果你在 RHEL 上并且出现权限被拒绝错误,它又是 SELinux... 必须暂时执行 setenforce 0 :P【参考方案2】:

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

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

【讨论】:

/bin/ashash 有什么区别? /bin/shsh 类似。 嗨@peter-mortensen,区别在于ash 只是/bin/ash 的符号链接。一些 linux 发行版没有符号链接。【参考方案3】:

现在,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

【讨论】:

【参考方案4】:

如果容器已经在运行:

docker exec -it container_id_or_name ash

【讨论】:

以上是关于在 Docker Alpine 容器中启动 shell的主要内容,如果未能解决你的问题,请参考以下文章

Docker openjdk-8-jdk-alpine 容器时间与jdk时区不同修改方法

使用“exit”后如何保留docker alpine容器?

「容器架构」Debian和 Alpine作为基准Docker映像的对比

如何让 /etc/profile 在 Alpine / Docker 中自动运行

无法在基于 Alpine 的 Docker 容器中运行 Play 框架应用程序

如何在 Alpine Docker 容器中运行 Bash 脚本?