我希望能够在无法连接到 rabbitmq 时重新启动 golang docker 文件,不幸的是,我的 golang 容器将退出但永远不会重新启动,我不知道为什么。码头工人组成:version: '3.3'services: mongo: image: 'mongo:3.4.1' container_name: 'datastore' ports: - '27017:27017' rabbitmq: restart: always tty: true image: rabbitmq:3.7-management-alpine hostname: "rabbit" ports: - "15672:15672" - "5672:5672" labels: NAME: "rabbitmq" volumes: - ./rabbitmq-isolated.conf:/etc/rabbitmq/rabbitmq.config healthcheck: test: ["CMD", "curl", "-f", "http://localhost:15672"] interval: 3s timeout: 5s retries: 20 api: restart: always tty: true container_name: 'api' build: '.' working_dir: /go/src/github.com/patientplatypus/project ports: - '8000:8000' volumes: - './:/go/src/github.com/patientplatypus/project' - './uploads:/uploads' - './scripts:/scripts' - './templates:/templates' depends_on: - "mongo" - "rabbitmq"码头文件:FROM golang:latestWORKDIR /go/src/github.com/patientplatypus/projectCOPY . .RUN go get github.com/imroc/req<...more go gets...>RUN go get github.com/joho/godotenvEXPOSE 8000ENTRYPOINT [ "fresh" ]这是我的 golang 代码:package mainimport ( "fmt" "log" "os" "os/exec" "net/http")func main() { fmt.Println("Golang server started") godotenv.Load() fmt.Println("now doing healthcheck on rabbit") exec.Command("docker-compose restart api") os.Exit(1) <...>
1 回答
慕村9548890
TA贡献1884条经验 获得超4个赞
Docker 文档说:
重启策略只有在容器启动成功后才会生效。在这种情况下,启动成功意味着容器已经启动至少 10 秒,并且 Docker 已经开始对其进行监控。这可以防止根本没有启动的容器进入重启循环。
由于您显示的 Go 代码基本上立即退出,因此它永远不会满足这个 10 秒最小规则。
您可以使用time.After强制 Go 等待,直到进程至少存活 10 秒,有点像:
ch := time.After(10 * time.Second) defer (func() { fmt.Println("waiting"); <-ch; fmt.Println("waited") })()
也就是说,创建一个将在 10 秒后接收事件的通道,然后在返回之前实际接收它(如果发生则立即接收,否则等待)main
。从使用https://play.golang.org/p/zGY5jFWbXyk开始,一个技巧是在从频道接收后需要有一些可观察到的效果,否则它实际上不会等待。
- 1 回答
- 0 关注
- 106 浏览
添加回答
举报
0/150
提交
取消