Golang Docker容器未在Docker Compose中重新启动
我希望能够在连接到rabbitmq失败时重新启动golang docker文件,如下所示:(参见答案:svenhornberg)。 不幸的是,我的golang容器将退出,但永远不会重新启动,我不知道为什么 Docker compose:Golang Docker容器未在Docker Compose中重新启动,docker,go,docker-compose,rabbitmq,restart,Docker,Go,Docker Compose,Rabbitmq,Restart,我希望能够在连接到rabbitmq失败时重新启动golang docker文件,如下所示:(参见答案:svenhornberg)。 不幸的是,我的golang容器将退出,但永远不会重新启动,我不知道为什么 Docker compose: version: '3.3' services: mongo: image: 'mongo:3.4.1' container_name: 'datastore' ports: - '27017:27017' rabbi
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"
Docker文件:
FROM golang:latest
WORKDIR /go/src/github.com/patientplatypus/project
COPY . .
RUN go get github.com/imroc/req
<...more go gets...>
RUN go get github.com/joho/godotenv
EXPOSE 8000
ENTRYPOINT [ "fresh" ]
来自golang的:最新版本
WORKDIR/go/src/github.com/patientplatypus/project
复制
运行go-get-github.com/imroc/req
运行go-get-github.com/joho/godotenv
曝光8000
入口点[“新鲜”]
这是我的golang代码:
package main
import (
"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)
<...>
主程序包
进口(
“fmt”
“日志”
“操作系统”
“os/exec”
“net/http”
)
func main(){
fmt.Println(“Golang服务器已启动”)
godotenv.Load()
fmt.Println(“正在对兔子进行健康检查”)
exec.命令(“docker compose restart api”)
操作系统退出(1)
这是我的终端输出(兔子呼叫后golang从不重新启动):
api | 23:23:00应用程序| Golang服务器已启动
api | 23:23:00应用程序|正在对兔子进行健康检查
拉比特犬1 |
兔子1 |####
rabbitmq_1 |####rabbitmq 3.7.11.版权所有(C)2007-2019 Pivotal Software,Inc。
rabbitmq|u 1|##########################http://www.rabbitmq.com/
兔子1号##
兔子1号日志:
我很困惑如何让它工作。我做错了什么
编辑:
exec.Command
执行不正确,但是os.Exit(1)
,log.Fatal
,和log.Panic
退出容器,但容器不会重新启动。仍然混乱。
重新启动策略仅在容器成功启动后生效。在这种情况下,成功启动意味着容器已启动至少10秒,并且Docker已开始监视它。这可防止根本未启动的容器进入重新启动循环
由于您显示的Go代码基本上是立即退出的,因此它永远不会满足这个10秒最小规则
您可以使用以下类似的方法强制Go等待,直到进程处于活动状态至少10秒:
ch:=时间后(10*时间秒)
延迟(func(){fmt.Println(“等待”);
重新启动策略仅在容器成功启动后生效。在这种情况下,成功启动意味着容器已启动至少10秒,并且Docker已开始监视它。这可防止根本未启动的容器进入重新启动循环
由于您显示的Go代码基本上是立即退出的,因此它永远不会满足这个10秒最小规则
您可以使用以下类似的方法强制Go等待,直到进程处于活动状态至少10秒:
ch:=时间后(10*时间秒)
延迟(func(){fmt.Println(“waiting”);永远不要忽略错误。您的exec.Command
调用错误。我已更新帖子。您如何调用docker compose
@DavidMaze我不确定我是否理解这个问题。我使用了docker compose-up--build
,正如您在上面看到的,我的每个容器都被标记为restart:always
。啊,我看到了注意:在swarm模式下使用(版本3)部署堆栈时忽略此选项撰写文件。改用重新启动策略。
我认为这种情况不适用。永远不要忽略错误。您的exec.Command
调用错误。我更新了帖子。您如何调用docker Compose
?(一些调用)@DavidMaze我不确定我是否理解这个问题。我使用了docker compose-up--build
,正如您在上面看到的,我的每个容器都被标记为restart:always
。啊,我看到了注意:在swarm模式下使用(版本3)部署堆栈时忽略此选项撰写文件。改为使用重新启动策略。
我认为这种情况不适用。感谢您挖掘重新启动的简介,非常有帮助。我认为最简单的方法是在main开始时测试与兔子uri的连接,并在错误睡眠10秒。谢谢!感谢您挖掘重新启动的简介,非常有帮助。我认为最简单的方法是在main的开头测试到兔子uri的连接,并在错误睡眠10秒。谢谢!
api | 23:23:00 app | Golang server started
api | 23:23:00 app | now doing healthcheck on rabbit
rabbitmq_1 |
rabbitmq_1 | ## ##
rabbitmq_1 | ## ## RabbitMQ 3.7.11. Copyright (C) 2007-2019 Pivotal Software, Inc.
rabbitmq_1 | ########## Licensed under the MPL. See http://www.rabbitmq.com/
rabbitmq_1 | ###### ##
rabbitmq_1 | ########## Logs: <stdout>
<...more rabbit logging...>