У меня есть контейнер, который выполняет миграцию базы данных ( source ):
FROM golang:1.12-alpine3.10 AS downloader
ARG VERSION
RUN apk add --no-cache git gcc musl-dev
WORKDIR /go/src/github.com/golang-migrate/migrate
COPY . ./
ENV GO111MODULE=on
ENV DATABASES="postgres mysql redshift cassandra spanner cockroachdb clickhouse mongodb sqlserver firebird"
ENV SOURCES="file go_bindata github github_ee aws_s3 google_cloud_storage godoc_vfs gitlab"
RUN go build -a -o build/migrate.linux-386 -ldflags="-s -w -X main.Version=${VERSION}" -tags "$DATABASES $SOURCES" ./cmd/migrate
FROM alpine:3.10
RUN apk add --no-cache ca-certificates
COPY --from=downloader /go/src/github.com/golang-migrate/migrate/build/migrate.linux-386 /migrate
ENTRYPOINT ["/migrate"]
CMD ["--help"]
Я хочу интегрировать его в docker-compose и сделать его зависимым от службы баз данных Postgres,Однако, поскольку мне приходится ждать полной инициализации базы данных, я должен обернуть команду migrate
в сценарий и, таким образом, заменить точку входа контейнера миграции. Я использую сценарий wait-for для опроса базы данных, который является сценарием чистой оболочки (не bash) и, следовательно, должен работать в альпийском контейнере.
Вот как сервисопределяется в docker-compose:
services:
database:
# ...
migration:
depends_on:
- database
image: migrate/migrate:v4.7.0
volumes:
- ./scripts/migrations:/migrations
- ./scripts/wait-for:/wait-for
entrypoint: ["/bin/sh"]
command: ["./wait-for database:5432", "--", "./migrate", "-path", "/migrations", "-database", "postgres://test:test@database:5432/test?sslmode=disable", "-verbose", "up"]
Запуск docker-compose up
на этом завершается неудачно с
migration_1 | /bin/sh: can't open './wait-for database:5432': No such file or directory
Запуск контейнера переноса для себя с помощью
docker run -it --entrypoint /bin/sh -v $(pwd)/scripts/wait-for:/wait-for migrate/migrate:v4.7.0
работает безупречно, скрипт есть и может быть запущен с /bin/sh ./wait-for
.
Так почему же он не работает как часть docker-compose?