如何从同一终端内停止正在运行的 Docker 容器?

问题描述 投票:0回答:8

我构建了一个

Dockerfile
,最终编译我的(Golang)代码,然后运行编译后的二进制文件:

# Compile my Go code
RUN go build -o bin *.go

# Run the binary
CMD /root/src/whisky/bin

构建图像后 (

docker build -t whisky .
),我运行图像 (
docker run --name whisky whisky_image
),程序开始在终端中输出。

当我从笔记本电脑运行该程序时,我总是可以使用

CTRL+C
停止它,但现在它在容器内运行,点击
CTRL+C
不会执行任何操作。容器只是不断提供输出,没有任何停止。

我仍然可以从另一个终端停止容器

docker stop whisky
,但我想应该有更好的方法。

有人知道在容器中停止命令或从同一终端停止整个容器的推荐方法吗?

[编辑]

从给出的答案中我了解到我可以使用

-d
以分离模式运行容器,然后使用
docker logs container_id --follow
跟踪容器日志。虽然这有效,但我更喜欢直接运行容器(在非分离模式下),因为这样我就不会犯在后台运行它并忘记它的错误。

有谁知道我如何运行容器,以便我可以通过点击

CTRL+C
从同一终端停止它?

linux docker
8个回答
2
投票

您可以在分离模式下使用“-d”-->

[编辑] 要添加。之后,您可以使用

追踪日志
docker logs container_id --follow

2
投票

分配一个伪终端(

-t
),然后你可以通过点击
CTRL+C
来控制输出:

$ docker run --name whisky -t whisky_image
^C

但是容器仍将运行,因此还添加标准输入(

-i
):

$ docker run --name whisky -ti whisky_image
^C

但是容器仍然存在(参见

docker ps -a
- 处于退出状态),因此您可以添加清理标志
--rm

$ docker run --name whisky --rm -ti whisky_image
^C

请参阅 Docker 运行文档了解更多详细信息。


1
投票

您需要使用

init

运行容器
docker run --init --name whisky whisky_image

然后使用

Ctrl+C

杀死它

init
将启动您的程序为
PID 1


1
投票

Dockerfile

FROM golang

WORKDIR /go/src/app

ADD . .

# Compile my Go code
RUN go build -o bin *.go

# Run the binary
CMD /go/src/app/bin

Go 程序

package main

import (
    "fmt"
    "time"
)

func main() {

    for {
        fmt.Println("\nWHISKY TIME: ", time.Now().String())
        time.Sleep(time.Second)
    }
}

构建容器

╭─exadra37@exadra37-Vostro-470 ~/Developer/DevNull/stackoverflow  
╰─➤  sudo docker build -t whisky . 
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM golang
 ---> c4d6fdf2260a
Step 2/5 : WORKDIR /go/src/app
 ---> Using cache
 ---> ab35c58a3608
Step 3/5 : ADD . .
 ---> 320a51d3e579
Step 4/5 : RUN go build -o bin *.go
 ---> Running in 5db9f4a9cbe1
Removing intermediate container 5db9f4a9cbe1
 ---> e16b272606da
Step 5/5 : CMD /go/src/app/bin
 ---> Running in f66039aeb53a
Removing intermediate container f66039aeb53a
 ---> d453f9e10c49
Successfully built d453f9e10c49
Successfully tagged whisky:latest

运行容器

╭─exadra37@exadra37-Vostro-470 ~/Developer/DevNull/stackoverflow  
╰─➤  sudo docker run -it --name whisky whisky                                                                                                                                                                137 ↵

WHISKY TIME:  2019-11-25 16:19:26.397705029 +0000 UTC m=+0.000041700

WHISKY TIME:  2019-11-25 16:19:27.399189969 +0000 UTC m=+1.001526690

WHISKY TIME:  2019-11-25 16:19:28.399392173 +0000 UTC m=+2.001728894

WHISKY TIME:  2019-11-25 16:19:29.399566682 +0000 UTC m=+3.001903403
^C%                                                                   

正如你所看到的,我可以用

CTRL + C
来阻止它,我只需要使用标志
-it

使用的标志:

╭─exadra37@exadra37-Vostro-470 ~/Developer/DevNull/stackoverflow  
╰─➤  docker run --help | grep "\-t, \-\-tty" -                                                                                                                                                                 2 ↵
  -t, --tty                            Allocate a pseudo-TTY
╭─exadra37@exadra37-Vostro-470 ~/Developer/DevNull/stackoverflow  
╰─➤  docker run --help | grep "\-i, \-\-interactive" -
  -i, --interactive                    Keep STDIN open even if not attached

重新启动容器

╭─exadra37@exadra37-Vostro-470 ~/Developer/DevNull/stackoverflow  
╰─➤  sudo docker start -i whisky

WHISKY TIME:  2019-11-25 16:21:03.159420042 +0000 UTC m=+0.000047654

WHISKY TIME:  2019-11-25 16:21:04.161264182 +0000 UTC m=+1.001891819

WHISKY TIME:  2019-11-25 16:21:05.161470301 +0000 UTC m=+2.002097939
^C%                                                         

重新启动容器时,我们只需要使用标志

-i
,您仍然可以使用
CTRL + C
来停止它。

使用的标志:

╭─exadra37@exadra37-Vostro-470 ~/Developer/DevNull/stackoverflow  
╰─➤  docker start --help | grep "\-i, \-\-interactive" -
  -i, --interactive             Attach container's STDIN

1
投票

如前所述,有 2 种可能性,第一种,分离进程(

-d
选项)或使用具有交互模式的 TTY(
-ti
选项)。

分离版本将允许您工作和管理实例,但不会通过按 CTRL+C

让您失望

具有交互模式 (

-i
) 的 TTY 版本将会。

所以,

docker run -it
应该可以解决问题

Docker Run 参考Docker 容器进程行为 也可以提供帮助


0
投票

试试这个:

# Compile my Go code
RUN go build -o bin *.go

# Run the binary
CMD ["/root/src/whisky/bin"]

这是执行形式。在这种形式下,您的可执行文件将被直接调用。 您使用的是 shell 形式,它通过 /bin/sh -c 启动您的进程。这种形式不会自动将信号传递给子进程。


0
投票

使用命令提示符停止 docker 容器

您可以使用以下命令提示符停止容器

sudo docker stop <Container id>

停止容器后可以查看所有容器的信息

sudo docker ps -a

这将显示容器列表,找到您的容器并看到会出现书面退出状态,这意味着您的容器已停止


-1
投票

要停止整个容器,请使用以下命令。

 $ docker stop <container>

docker stop 命令停止运行 Docker 容器。 它向 docker 容器内正在运行的进程发送 SIGTERM 信号并请求其终止。

© www.soinside.com 2019 - 2024. All rights reserved.