如何在docker映像的新容器中运行bash ?

我能够在从docker/whalesay映像创建的容器中运行任意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

为什么没有成功?我该怎么做呢?

266914 次浏览

如果你docker run没有附加tty,并且只调用bash,那么bash找不到任何事情要做,并退出。这是因为默认情况下,容器是非交互式的,在非交互式模式下运行的shell期望运行脚本。如果没有这一点,它将退出。

要运行一个一次性的新容器,你可以简单地附加一个tty和标准输入:

docker run --rm -it --entrypoint bash <image-name-or-id>

或者为了防止上面的容器被销毁,运行它时不要使用--rm

或者要输入一个运行的容器,请使用exec:

docker exec -it <container-name-or-id> bash

在评论中你问

你知道this和docker run -it --entrypoint bash docker/whalesay之间的区别吗?

在上面的两个命令中,你指定bash作为CMD. c。在这个命令中,你指定bash作为ENTRYPOINT

每个容器都使用ENTRYPOINTCMD的组合来运行。如果你(或图像)没有指定ENTRYPOINT,默认的入口点是/bin/sh -c

所以在前面的两个命令中,如果你运行bash作为CMD,并且使用默认的ENTRYPOINT,那么容器将使用

/bin/sh -c bash

如果指定--entrypoint bash,则它将运行

bash <command>

其中<command>是图像中指定的CMD(如果有指定的话)。