如何在已经存在的Docker容器上运行命令?

如何在已经存在的Docker容器上运行命令?,docker,Docker,我用-d创建了一个容器,因此它不是交互式的 docker run -d shykes/pybuilder bin/bash 我看到容器已退出: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d6c45e8cc5f0 shykes/pybuilder:

我用
-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
现在我想在机器上运行偶尔的命令并退出。只是为了得到回应

我试着启动机器。我试着连接。我想我可以使用容器调用
run
,但这似乎是不允许的。使用
start
似乎只是在运行,然后很快就存在了

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

我试过:

docker attach d6c45e8cc5f0
但我得到:

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

但如果我启动它,它无论如何都会退出。第22条。我不能赢。

假设映像使用默认入口点
/bin/sh-c
,运行
/bin/bash
将在守护进程模式下立即退出(
-d
)。如果希望此容器运行交互式shell,请使用
-it
而不是
-d
。如果要在通常执行另一个进程的容器中执行任意命令,可能需要尝试
nsenter
nsinit
。查看详细信息。

您的容器将退出,因为您发出的命令将结束。使用以下选项使其保持活动状态:

  • -i
    即使未连接,也保持标准DIN打开
  • -t
    分配一个伪TTY
因此,新的
run
命令是:

docker run -it -d shykes/pybuilder bin/bash
如果要附加到已运行的容器:

docker exec -it CONTAINER_ID /bin/bash
docker start -a -i `docker ps -q -l`
在这些示例中,
/bin/bash
用作命令。

2014年10月:

因此,现在您可以在运行的容器中运行任何命令,只需知道其ID(或名称):


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

此处的一些回答具有误导性,因为它们涉及正在运行而不是停止的容器

Sven Dowideit在Docker论坛上解释说,容器绑定到它们的进程(Docker无法更改已停止容器的进程,至少是由于其内部结构:)。因此,基本上唯一的选择是
commit
将容器提交到图像,然后
使用不同的命令运行它



(我相信“
ENTRYPOINT
with arguments”方法也不会奏效,因为您仍然无法将参数更改为已停止的容器。)

要扩展katrmr的答案,如果容器因错误而停止且无法启动,您需要将其提交到映像。然后可以在新映像中启动bash:

docker commit [CONTAINER_ID] temporary_image
docker run --entrypoint=bash -it temporary_image

这是我用上面的CDR LDN答案和我找到的答案组合而成的答案

以下示例从映像启动Arch Linux容器,然后使用
pacman
工具在该容器上安装
git

sudo docker run -it -d archlinux /bin/bash
sudo docker ps -l
sudo docker exec -it [container_ID] script /dev/null -c "pacman -S git --noconfirm"

仅此而已。

我必须使用bash-c来运行我的命令:
docker exec-it CONTAINER\u ID bash-c“mysql\u tzinfo\u sql/usr/share/zoneinfo | mysql-mysql”

创建一个容器并逐个向其发送命令:

docker create --name=my_new_container -it ubuntu
docker start my_new_container
// ps -a says 'Up X seconds'
docker exec my_new_container /path/to/my/command
// ps -a still says 'Up X+Y seconds'
docker exec my_new_container /path/to/another/command

不幸的是,要实现这一目标,不可能用带有
docker run--ENTRYPOINT
的参数覆盖
ENTRYPOINT

注意:您可以使用--ENTRYPOINT替代ENTRYPOINT设置,但是 这只能将二进制文件设置为exec(不使用sh-c)


简单回答:同时启动和连接。在这种情况下,你完全是在做你要求的事情

docker start <CONTAINER_ID/CONTAINER_NAME> && docker attach <CONTAINER_ID/CONTAINER_NAME> 
docker启动和docker连接(&C)

确保更改

,因此我认为答案比上面许多误导性的答案更简单

启动已停止的现有容器

docker start <container-name/ID>
docker start -ai <container-name/ID>
docker启动
停止正在运行的容器

docker stop <container-name/ID>
docker exec -it <container-name/ID> bash
docker站
然后登录到容器的交互式外壳

docker stop <container-name/ID>
docker exec -it <container-name/ID> bash
docker exec-it bash
启动现有容器并在一个命令中附加到它

docker start <container-name/ID>
docker start -ai <container-name/ID>
docker启动-ai

小心,这会使容器在出口处停止。但一般来说,您需要启动容器,在完成后连接并停止它。

将命令传送到stdin

必须卸下
-t
,才能使其工作:

echo 'touch myfile' | sudo docker exec -i CONTAINER_NAME bash
这比有时使用CLI选项更方便

通过以下方式进行测试:

sudo docker run --name ub16 -it ubuntu:16.04 bash
然后在另一个外壳上:

echo 'touch myfile' | sudo docker exec -i ub16 bash
然后在第一个shell上:

ls -l myfile

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

对于Mac:

$ docker exec -it <container-name> sh
$docker exec-it sh
如果要以root用户身份连接:

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

如果您试图运行shell脚本,则需要将其作为bash运行

docker exec -it containerid bash -c /path/to/your/script.sh
例:


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

为了做到这一点,我使用以下docker entrypoint命令在容器内运行命令提示符,或者附加到容器

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

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

恢复和访问最近退出的容器的快速方法:

docker exec -it CONTAINER_ID /bin/bash
docker start -a -i `docker ps -q -l`

我想指出,上面的答案有点误导

执行
docker run
的问题是每次都会创建一个新的容器。然而,在某些情况下,我们希望重新使用旧集装箱,或者不使用新集装箱占用空间

(给定的
是创建的容器的名称…)

在OP的情况下,通过执行以下命令确保docker映像首先运行:

docker run -it -d shykes/pybuilder /bin/bash
docker启动聪明的\u bardeen
然后,使用以下逗号执行docker容器