我用-d创建了一个容器,所以它不是交互式的。

docker run -d shykes/pybuilder bin/bash

我看到容器已经退出:

CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                      PORTS               NAMES
d6c45e8cc5f0        shykes/pybuilder:latest   "bin/bash"          41 minutes ago      Exited (0) 2 seconds ago                        clever_bardeen

现在我想偶尔在机器上运行一些命令,然后退出。只是为了得到回应。

我试着启动机器。我试着连接。我以为我可以调用运行与容器,但这似乎不被允许。使用start似乎只是运行,然后迅速存在。

退出后,我想回到交互模式。

我试着:

docker attach d6c45e8cc5f0

但我明白:

2014/10/01 22:33:34 You cannot attach to a stopped container, start it first

但如果我启动它,它还是会退出。赶上22。我赢不了。


当前回答

不幸的是,用docker run——ENTRYPOINT的参数来覆盖ENTRYPOINT是不可能实现这个目标的。

注意:你可以使用——ENTRYPOINT覆盖ENTRYPOINT设置,但是 这只能将二进制文件设置为exec(不会使用sh -c)。

其他回答

将一个命令管道到docker exec bash stdin

必须删除-t才能工作:

echo 'touch myfile' | docker exec -i CONTAINER_NAME bash

有时这比使用CLI选项更方便。

测试:

docker run --name ub16 -it ubuntu:16.04 bash

然后在另一个壳上:

echo 'touch myfile' | docker exec -i ub16 bash

然后在第一能层

ls -l myfile

在Docker 1.13.1, Ubuntu 16.04主机上测试。

Mac:

$ docker exec -it <container-name> sh

如果您想以root用户连接:

$ docker exec -u 0 -it <container-name> sh

我正在运行windows容器,我需要在docker容器中查看创建和复制的文件和文件夹。

为了做到这一点,我使用下面的docker entrypoint命令来获得在容器内运行或附加到容器的命令提示符。

ENTRYPOINT ["C:\\Windows\\System32\\cmd.exe", "-D", "FOREGROUND"]

这帮助我将命令提示符附加到容器,并使容器保持活动状态。:)

我必须使用bash -c来运行我的命令: docker exec - CONTAINER_ID bash "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"

2014年10月,Docker团队引入了Docker exec命令:https://docs.docker.com/engine/reference/commandline/exec/

所以现在你可以在一个运行的容器中运行任何命令,只需要知道它的ID(或名称):

docker exec -it <container_id_or_name> echo "Hello from container!"

注意,exec命令只对已经运行的容器有效。如果容器当前处于停止状态,则需要先运行以下命令:

docker run -it -d shykes/pybuilder /bin/bash

这里最重要的是-d选项,它代表分离。这意味着您最初提供给容器的命令(/bin/bash)将在后台运行,容器不会立即停止。