Linux 在Docker Alpine容器中启动外壳

Linux 在Docker Alpine容器中启动外壳,linux,docker,containers,alpine,Linux,Docker,Containers,Alpine,要启动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 但当为运行时,会出现以下结果: ole@T:~$ docker run -it --rm alpine Error

要启动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
但当为运行时,会出现以下结果:

ole@T:~$ docker run -it --rm alpine
Error response from daemon: No command specified
在Alpine base容器中启动交互式shell的命令是什么

ole@T:~$ docker run -it --rm alpine /bin/ash
(inside container) / # 
上面使用的选项:

  • /bin/ash
    是BusyBox提供的ash()
  • --rm
    在容器退出时自动移除容器(
    docker run--help
  • -i
    交互模式(即使未连接,也保持STDIN打开)
  • -t
    分配一个伪TTY

通常,Alpine Linux映像不包含
bash
,您可以使用
/bin/ash
/bin/sh
ash
或仅使用
sh

/垃圾箱/灰烬

docker run -it --rm alpine /bin/ash
/垃圾箱/垃圾箱

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


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

现在,默认情况下,Alpine Image将直接引导到
/bin/sh
,而无需指定要执行的shell:

$ sudo docker run -it --rm alpine  
/ # echo $0  
/bin/sh  
这是因为
alpine
image Dockerfiles现在包含一个命令,指定容器启动时要执行的shell:
CMD[“/bin/sh”]

在较旧的Alpine图像版本(2017年之前)中,未使用CMD命令,因为Docker用于为CMD创建附加层,这导致图像大小增加。这是阿尔卑斯山图像开发者想要避免的事情。在最新的Docker版本(1.10+)中,CMD不再占用图层,因此它被添加到
alpine
图像中。因此,只要未覆盖CMD,最近的Alpine映像将引导到
/bin/sh

如需参考,请参阅Glider Labs对官方阿尔卑斯码头文件的以下承诺:

如果容器已在运行:

docker exec -it container_id_or_name ash

当然-好主意-ash是shell,-rm在运行完成后移除容器。因此,如果希望容器在运行后仍然可用,请跳过使用--rm。我之所以使用它,是因为我只是在试验ATM。那么如何使用像ubuntu这样的分离属性来运行它呢?我相信在这两种情况下。。。乌班图或阿尔卑斯山。。。您只需给它一个
-d
选项。+1用于注意Alpine有
ash
而不是
bash
,这是因为我对Alpine不太熟悉,所以我无法更早地访问容器。如果您在RHEL上,并且出现权限被拒绝错误,则再次使用SELinux。。。必须临时执行设置强制0:p
/bin/ash
ash
之间的区别是什么?类似于
/bin/sh
sh
.Hi@peter mortensen,区别在于
ash
只是指向
/bin/ash
的符号链接。一些linux发行版没有符号链接。
$ sudo docker run -it --rm alpine  
/ # echo $0  
/bin/sh  
docker exec -it container_id_or_name ash