如何在已经存在的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
。查看详细信息。您的容器将退出,因为您发出的命令将结束。使用以下选项使其保持活动状态:
即使未连接,也保持标准DIN打开-i
分配一个伪TTY-t
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容器