Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang Docker容器未在Docker Compose中重新启动_Docker_Go_Docker Compose_Rabbitmq_Restart - Fatal编程技术网

Golang Docker容器未在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

我希望能够在连接到rabbitmq失败时重新启动golang docker文件,如下所示:(参见答案:svenhornberg)。 不幸的是,我的golang容器将退出,但永远不会重新启动,我不知道为什么

Docker compose:

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...>