我可以在从docker/whalesay image创建的容器中运行任意shell命令。
$ docker run docker/whalesay ls -l
total 56
-rw-r--r-- 1 root root 931 May 25 2015 ChangeLog
-rw-r--r-- 1 root root 385 May 25 2015 INSTALL
-rw-r--r-- 1 root root 1116 May 25 2015 LICENSE
-rw-r--r-- 1 root root 445 May 25 2015 MANIFEST
-rw-r--r-- 1 root root 1610 May 25 2015 README
-rw-r--r-- 1 root root 879 May 25 2015 Wrap.pm.diff
drwxr-xr-x 2 root root 4096 May 25 2015 cows
-rwxr-xr-x 1 root root 4129 May 25 2015 cowsay
-rw-r--r-- 1 root root 4690 May 25 2015 cowsay.1
-rw-r--r-- 1 root root 54 May 25 2015 install.pl
-rwxr-xr-x 1 root root 2046 May 25 2015 install.sh
-rw-r--r-- 1 root root 631 May 25 2015 pgp_public_key.txt
$ docker run docker/whalesay lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.2 LTS
Release: 14.04
Codename: trusty
但是,我无法在从该映像创建的容器中运行shell。
$ docker run docker/whalesay bash
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ce600cc9904 docker/whalesay "bash" 5 seconds ago Exited (0) 3 seconds ago loving_mayer
为什么不管用?我怎么才能让它工作?
1条答案
按热度按时间yquaqz181#
如果你
docker run
没有附加一个tty,并且只调用bash
,那么bash发现没有什么可做的,它就退出了。这是因为在默认情况下,容器是非交互式的,而在非交互模式下运行的shell需要运行脚本。如果没有,它将退出。要运行一次性的新容器,您可以简单地附加一个tty和标准输入:
或者为了防止上述容器被释放,请在不使用
--rm
的情况下运行它。或者要输入一个正在运行的容器,请使用
exec
:在您要求的评论中
你知道这和
docker run -it --entrypoint bash docker/whalesay
有什么区别吗?在上面的两个命令中,您将
bash
指定为CMD
。在此命令中,您指定bash
作为ENTRYPOINT
。每个容器都使用
ENTRYPOINT
和CMD
的组合运行。如果您(或图像)未指定ENTRYPOINT
,则默认入口点为/bin/sh -c
。因此,在前面的两个命令中,如果将
bash
作为CMD
运行,并且使用默认的ENTRYPOINT
,则容器将使用如果指定
--entrypoint bash
,则它将运行其中
<command>
是在图像中指定的CMD
(如果指定了任何)。