У меня есть любопытная ситуация, когда моя сборка 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) настроен нормально.
Что не так?