gpt4 book ai didi

docker - 初始化 : true does not forward signals

转载 作者:IT王子 更新时间:2023-10-29 01:46:41 26 4
gpt4 key购买 nike

我希望我的 dockerized 进程能够正确处理终止信号,所以我使用 init:true。我在我的 docker-compose.yml 文件中使用以下代码:

version: '3.7'

services:
foo:
build:
context: ./foo
init: true

但是,我的进程没有收到信号。

当我在 docker 外部 运行我的进程并按下 Ctrl-C 时,我可以看到正在处理信号(我的程序在信号处理程序中打印一条消息),但 在内部 docker 没有处理信号(我的程序没有打印消息)

编辑:

这是foo/Dockerfile:

FROM golang:1.11.4-alpine3.8 AS build
WORKDIR /go/src/foo
COPY ./ ./
RUN go build -a -tags netgo .
FROM alpine:3.8
WORKDIR /app
COPY --from=build /go/src/foo .
CMD ["./foo"]

这是 foo/foo.go(只是在循环中打印“等待”消息,直到它收到信号):

package main

import (
"fmt"
"os"
"os/signal"
"time"
"syscall"
)

var done chan bool
var dur time.Duration

func main() {
sigs := make(chan os.Signal)
done = make(chan bool)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
pid := os.Getpid()
fmt.Println("pid:", pid)

go func() {
sig := <-sigs
fmt.Println(sig)
done <- true
}()

fmt.Println("waiting")

dur, _ = time.ParseDuration("2s")

waitLoop()

fmt.Println("exiting")
}

func waitLoop() {
for {
select {
case _ = <-done:
fmt.Println("got done")
return

case <- time.After(dur):
}

fmt.Println("still waiting")
}
}

当我在没有 Docker 的情况下构建和运行 foo.go 时,当我按下 Ctrl-C 时,程序会正常退出(打印“中断”、“完成”和“退出”)。当我使用 Docker 运行时,这些消息都没有打印出来……它就退出了。在这两种情况下,打印的 pid 都 > 1。

最佳答案

我无法重现您的问题:

$ docker-compose up -d            
Building foo
...
Successfully built 985c899d39fc
Successfully tagged init-issue_foo:latest
WARNING: Image for service foo was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating init-issue_foo_1_5d74c24a9fce ... done

$ docker-compose stop foo
Stopping init-issue_foo_1_e08f90ae3c56 ... done

$ docker-compose logs foo
Attaching to init-issue_foo_1_e08f90ae3c56
foo_1_e08f90ae3c56 | pid: 8
foo_1_e08f90ae3c56 | waiting
foo_1_e08f90ae3c56 | still waiting
foo_1_e08f90ae3c56 | still waiting
foo_1_e08f90ae3c56 | still waiting
foo_1_e08f90ae3c56 | still waiting
foo_1_e08f90ae3c56 | still waiting
foo_1_e08f90ae3c56 | still waiting
foo_1_e08f90ae3c56 | still waiting
foo_1_e08f90ae3c56 | still waiting
foo_1_e08f90ae3c56 | still waiting
foo_1_e08f90ae3c56 | terminated
foo_1_e08f90ae3c56 | got done
foo_1_e08f90ae3c56 | exiting

如果我尝试直接运行它:

$ docker run -it --rm --init init-issue_foo
pid: 8
waiting
still waiting
^Cinterrupt
got done
exiting

在每种情况下,我都会看到“完成”行。如果您仍然无法从上面的示例中成功实现此功能,请显示您的确切命令及其运行的输出。

关于docker - 初始化 : true does not forward signals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55542550/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com