我能够在从 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
为什么它不起作用?我怎样才能让它工作?
如果您docker run没有附加 tty,而只调用bash,则 bash 无事可做,然后退出。这是因为默认情况下,容器是非交互的,而在非交互模式下运行的 shell 需要运行脚本。没有它,它将退出。
docker run
bash
要运行一次性的新容器,您可以简单地附加一个 tty 和标准输入:
docker run --rm -it --entrypoint bash <image-name-or-id>
或者为了防止上述容器被丢弃,请在没有--rm.
--rm
或者要进入正在运行的容器,请exec改用:
exec
docker exec -it <container-name-or-id> bash
在你问的评论中
你知道这个和有什么区别docker run -it --entrypoint bash docker/whalesay吗?
docker run -it --entrypoint bash docker/whalesay
在上面的两个命令中,您指定bash为CMD. 在此命令中,您指定bash为ENTRYPOINT.
CMD
ENTRYPOINT
每个容器都使用ENTRYPOINT和的组合运行CMD。如果您(或图像)未指定ENTRYPOINT,则默认入口点为/bin/sh -c.
/bin/sh -c
所以在前面的两个命令中,如果你bash作为运行CMD,并且使用默认值ENTRYPOINT,那么容器将使用运行
/bin/sh -c bash
如果您指定--entrypoint bash,则改为运行
--entrypoint bash
bash <command>
图像中指定<command>的CMD位置(如果指定)。
<command>