Невозможно получить dep и dockerize, работая вместе в docker-compose (но они работают отдельно).Зачем? - PullRequest
0 голосов
/ 04 июня 2018

У меня есть любопытная ситуация, когда моя сборка docker-compose не завершится, когда я использую dockerize для ожидания готовности баз данных и т. Д., И использую dep для загрузки моих зависимостей Go.

Вот выдержка из docker-compose.yml (кроме контейнера golang, показанного ниже, есть контейнеры mosquitto, postgres и python)

version '3.3'
services:

   foobar_container:
     image: foobar_image
     container_name: foobar
     build:
      context: ./build_foobar
      dockerfile: Dockerfile.foobar
     #command: dockerize -wait tcp://mosquitto:1883 -wait tcp://postgres:5432 -timeout 200s /go/src/foobar/main
     volumes:
       - ./foobar:/go
     stdin_open: true
     tty: true
     external_links:
       - mosquitto
       - postgres
     ports:
       - 1833
       - 8001
     depends_on:
       - mosquitto
       - postgres

Вот мой Dockerfile.foobar

FROM golang:latest
 WORKDIR /go
 RUN apt-get update && apt-get install -y wget mosquitto-clients net-tools
 ENV DOCKERIZE_VERSION v0.6.0
 RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
   && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
   && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
 ADD foobar.sh /foobar.sh
 #RUN go build main.go
 RUN chmod +x /foobar.sh

Вот мой сценарий сборки foobar.sh:

#!/bin/bash

mkdir -p /go/bin # required directory that may have been overwriten by docker-compose `volumes` param
echo "++++++++ Downloading Golang dependencies ... ++++++++"
cd /go/src/foobar
curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
echo "++++++++ Installing Golang dependencies ... ++++++++"
dep ensure
echo "++++++++ Testing MQTT message broker ... ++++++++"
until [[ $(mosquitto_sub -h "mosquitto" -t '$SYS/#' -C 1 | cut -c 1-9) = "mosquitto" ]]; do
    echo "++++++++ Message broker is not ready. Waiting one second... ++++++++"
    sleep 1
done
echo "++++++++ Building application... ++++++++" 
go build main.go

Если я раскомментирую command строку docker-compose.yml, мой foobar.sh не будет проходить мимо curl.Ошибка не выводится, выполнение просто останавливается.Если я буду комментировать начиная с curl и раскомментировать строку command, я смогу завершить настройку (однако контейнер foobar необходимо запустить вручную).Мой контейнер Python (который зависит от всех контейнеров postgres, go и mosquitto) настроен нормально.

Что не так?

1 Ответ

0 голосов
/ 04 июня 2018

Я нашел пару вещей: во-первых, порядок выполнения, вы должны убедиться, что foobar.sh выполняется первым.В качестве еще одной рекомендации, я бы не стал переопределять всю папку /go внутри контейнера, используя тома, вместо этого использовал бы другую подпапку, например /go/github.com/my-project.Я получил приложение, работающее с использованием этой конфигурации, основанное на вашем:

build_foobar/Dockerfile.foobar:

FROM golang:latest
WORKDIR /go
RUN apt-get update && apt-get install -y wget mosquitto-clients net-tools
ENV DOCKERIZE_VERSION v0.6.0
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
        && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
        && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
ADD foobar.sh /foobar.sh
# RUN go build main.go
RUN chmod +x /foobar.sh

build_foobar/foobar.sh:

#!/bin/bash

# mkdir -p /go/bin # required directory that may have been overwriten by docker-compose `volumes` param
echo "++++++++ Downloading Golang dependencies ... ++++++++"
cd /go/src/foobar
curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
echo "++++++++ Installing Golang dependencies ... ++++++++"
dep ensure
echo "++++++++ Testing MQTT message broker ... ++++++++"
until [[ $(mosquitto_sub -h "mosquitto" -t '$SYS/#' -C 1 | cut -c 1-9) = "mosquitto" ]]; do
    echo "++++++++ Message broker is not ready. Waiting one second... ++++++++"
    sleep 1
done
echo "++++++++ Building application... ++++++++" 
go build main.go

dockerize -wait tcp://mosquitto:1883 -wait tcp://postgres:5432 -timeout 200s /go/src/foobar/main

foobar/main.go: местоОсновной файл вашего приложения

docker-compose.yml:

version: '3.3'
services:
  foobar_container:
    image: foobar_image
    container_name: foobar
    build:
      context: ./build_foobar
      dockerfile: Dockerfile.foobar
    # command: dockerize -wait tcp://mosquitto:1883 -wait tcp://postgres:5432 -timeout 200s /go/src/foobar/main
    # command: /bin/bash
    command: /foobar.sh
    volumes:
      - ./foobar:/go/src/foobar
    stdin_open: true
    tty: true
    external_links:
      - mosquitto
      - postgres
    depends_on:
      - mosquitto
      - postgres
    ports:
      - 1833
      - 8001
  mosquitto:
    image: eclipse-mosquitto
  postgres:
    image: postgres
...