Контейнер Golang Docker не перезапускается в Docker-Compose - PullRequest
0 голосов
/ 18 февраля 2019

Я хочу иметь возможность перезапустить Docker-файл golang при невозможности подключения к rabbitmq, как указано здесь: ( Docker Compose ожидает контейнера X перед запуском Y , см. Ответ по адресу: 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:

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

А вот мой вывод терминала (golang никогда не перезапускается после вызова кролика):

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

Я очень запутался, как заставить это работать.Что я делаю не так?

РЕДАКТИРОВАТЬ:

exec.Command был реализован неправильно, однако os.Exit(1), log.Fatal и log.Panic выходят из контейнера, но контейнер незапустить снова.Все еще в замешательстве.

1 Ответ

0 голосов
/ 18 февраля 2019

Документация Docker гласит:

Политика перезапуска вступает в силу только после успешного запуска контейнера.В этом случае успешный запуск означает, что контейнер работает не менее 10 секунд, и Docker начал его мониторинг.Это предотвращает переход контейнера, который вообще не запускается, в цикл перезапуска.

Поскольку код Go, который вы показываете, в основном завершается немедленно, он никогда не соответствует этому правилу минимума в 10 секунд.

Вы можете заставить Go ждать до тех пор, пока процесс не будет запущен минимум 10 секунд, используя time.After примерно так:

ch := time.After(10 * time.Second)
defer (func() { fmt.Println("waiting"); <-ch; fmt.Println("waited") })()

То есть, создать канал, которыйполучит событие через 10 секунд, а затем фактически получит его (немедленно, если это произошло, ждет, если нет), прежде чем main вернется.Играя с https://play.golang.org/p/zGY5jFWbXyk,, уловка заключается в том, что после получения от канала необходим какой-то заметный эффект, иначе он фактически не ждет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...