Golang Docker 容器未在 Docker-Compose 中重新启动

我希望能够在无法连接到 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: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 代码:


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)

  <...>


慕田峪9158850
浏览 107回答 1
1回答

慕村9548890

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开始,一个技巧是在从频道接收后需要有一些可观察到的效果,否则它实际上不会等待。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go