我创建了一个容器,-d因此它不是交互式的.
docker run -d shykes/pybuilder bin/bash
Run Code Online (Sandbox Code Playgroud)
我看到容器已退出:
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 Code Online (Sandbox Code Playgroud)
现在我想在机器上运行偶尔的命令并退出.只是为了得到答复.
我试着启动机器.我试着附上.我以为我可以run用容器打电话,但似乎不允许这样做.使用start似乎只是运行然后快速存在.
退出后我想回到交互模式.
我试过了:
docker attach d6c45e8cc5f0
Run Code Online (Sandbox Code Playgroud)
但我得到:
2014/10/01 22:33:34 You cannot attach to a stopped container, start it first
Run Code Online (Sandbox Code Playgroud)
但是,如果我开始它,它无论如何都会退出.抓住22.我无法获胜.
Sca*_*dge 512
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!"
Run Code Online (Sandbox Code Playgroud)
请注意,该exec命令仅适用于已在运行的容器.如果容器当前已停止,则需要先使用以下命令运行它:
docker run -it -d shykes/pybuilder /bin/bash
Run Code Online (Sandbox Code Playgroud)
这里最重要的是-d选项,它代表着detached.这意味着您最初提供给container(/bin/bash)的命令将在后台运行,容器不会立即停止.
cdr*_*rev 281
您的容器将退出,因为您提供的命令将结束.使用以下选项使其保持活动状态:
-i 即使没有连接,也要保持STDIN打开.-t 分配伪TTY.所以你的新run命令是:
docker run -it -d shykes/pybuilder bin/bash
Run Code Online (Sandbox Code Playgroud)
如果您想要附加到已经运行的容器:
docker exec -it CONTAINER_ID /bin/bash
Run Code Online (Sandbox Code Playgroud)
在这些示例/bin/bash中用作命令.
Pet*_* T. 103
所以我认为答案很简单,而不是上面的许多误导性答案.
启动已停止的现有容器
docker start <container-name/ID>
Run Code Online (Sandbox Code Playgroud)
停止正在运行的容器
docker stop <container-name/ID>
Run Code Online (Sandbox Code Playgroud)
然后登录到容器的交互式shell
docker exec -it <container-name/ID> bash
Run Code Online (Sandbox Code Playgroud)
Aar*_*n V 89
要扩展katrmr的答案,如果容器因为错误而停止并且无法启动,则需要将commit其映射到图像.然后你可以在新图像中启动bash:
docker commit [CONTAINER_ID] temporary_image
docker run --entrypoint=bash -it temporary_image
Run Code Online (Sandbox Code Playgroud)
kat*_*rmr 40
这里的一些答案具有误导性,因为它们涉及正在运行但未停止的容器.
Sven Dowideit在Docker论坛上解释说容器绑定到他们的进程(Docker无法改变已停止容器的进程,看起来至少应该归因于其内部结构:https://github.com/docker/docker/issues/1437).因此,基本上唯一的选择是commit容器到图像,run并使用不同的命令.
请参阅https://forums.docker.com/t/run-command-in-stopped-container/343
(我认为" ENTRYPOINT带参数"方法也不起作用,因为您仍然无法更改停止容器的参数.)
vel*_*lop 20
我不得不使用bash -c来运行我的命令:
docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"
lan*_*.io 17
创建一个容器并逐个发送命令:
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
Run Code Online (Sandbox Code Playgroud)
我想指出的是,最上面的答案有点误导。
执行的问题docker run是每次都会创建一个新容器。然而,在某些情况下,我们希望重新访问旧容器或不占用新容器的空间。
(给出的clever_bardeen是创建的容器的名称......)
在 OP 的情况下,请通过执行以下命令确保 docker 映像首先运行:
docker start clever_bardeen
Run Code Online (Sandbox Code Playgroud)
然后,使用以下命令执行 docker 容器:
docker exec -it clever_bardeen /bin/bash
Run Code Online (Sandbox Code Playgroud)
这是我使用上面的CDR LDN答案和我在这里找到的答案组成的综合答案.
以下示例从映像启动Arch Linux容器,然后git使用该pacman工具在该容器上安装:
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"
Run Code Online (Sandbox Code Playgroud)
就这些.
如果您尝试运行 shell 脚本,则需要将其作为 bash 运行。
docker exec -it containerid bash -c /path/to/your/script.sh
Run Code Online (Sandbox Code Playgroud)
管道命令到标准输入
必须删除-t它才能工作:
echo 'touch myfile' | sudo docker exec -i CONTAINER_NAME bash
Run Code Online (Sandbox Code Playgroud)
这有时比使用 CLI 选项更方便。
测试:
sudo docker run --name ub16 -it ubuntu:16.04 bash
Run Code Online (Sandbox Code Playgroud)
然后在另一个外壳上:
echo 'touch myfile' | sudo docker exec -i ub16 bash
Run Code Online (Sandbox Code Playgroud)
然后在第一个外壳上:
ls -l myfile
Run Code Online (Sandbox Code Playgroud)
在 Docker 1.13.1、Ubuntu 16.04 主机上测试。
我通常用这个:
docker exec -it my-container-name bash
Run Code Online (Sandbox Code Playgroud)
与正在运行的容器持续交互。
| 归档时间: |
|
| 查看次数: |
494656 次 |
| 最近记录: |