我构建了一个
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
从同一终端停止它?
您可以在分离模式下使用“-d”-->
[编辑] 要添加。之后,您可以使用
追踪日志docker logs container_id --follow
分配一个伪终端(
-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 运行文档了解更多详细信息。
您需要使用
init
运行容器
docker run --init --name whisky whisky_image
然后使用
Ctrl+C
杀死它
init
将启动您的程序为PID 1
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
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
如前所述,有 2 种可能性,第一种,分离进程(
-d
选项)或使用具有交互模式的 TTY(-ti
选项)。
分离版本将允许您工作和管理实例,但不会通过按 CTRL+C
让您失望具有交互模式 (
-i
) 的 TTY 版本将会。
所以,
docker run -it
应该可以解决问题
Docker Run 参考 和 Docker 容器进程行为 也可以提供帮助
试试这个:
# Compile my Go code
RUN go build -o bin *.go
# Run the binary
CMD ["/root/src/whisky/bin"]
这是执行形式。在这种形式下,您的可执行文件将被直接调用。 您使用的是 shell 形式,它通过 /bin/sh -c 启动您的进程。这种形式不会自动将信号传递给子进程。
使用命令提示符停止 docker 容器
您可以使用以下命令提示符停止容器
sudo docker stop <Container id>
停止容器后可以查看所有容器的信息
sudo docker ps -a
这将显示容器列表,找到您的容器并看到会出现书面退出状态,这意味着您的容器已停止
要停止整个容器,请使用以下命令。
$ docker stop <container>
docker stop 命令停止运行 Docker 容器。 它向 docker 容器内正在运行的进程发送 SIGTERM 信号并请求其终止。