/ bin / sh: нет такого файла или каталога при настройке точки входа docker-compose - PullRequest
0 голосов
/ 26 октября 2019

У меня есть контейнер, который выполняет миграцию базы данных ( 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?

Ответы [ 2 ]

2 голосов
/ 26 октября 2019

Если вы внимательно прочитаете сообщение об ошибке, вы увидите, что файл, который не может быть найден, не ./waitfor, это ./wait-for database:5432. Это согласуется с вашим входным файлом, где все это задано как первый элемент списка command:

        command: ["./wait-for database:5432", "--", "./migrate", "-path", "/migrations", "-database", "postgres://test:test@database:5432/test?sslmode=disable",  "-verbose", "up"]

Мне неясно, чего вы на самом деле хотите, поскольку представленные рабочие альтернативыне похоже, что это полностью аналогично, но, возможно, это

        command: ["./wait-for", "database:5432", "--", "./migrate", "-path", "/migrations", "-database", "postgres://test:test@database:5432/test?sslmode=disable",  "-verbose", "up"]
0 голосов
/ 26 октября 2019

Запуск контейнера переноса для себя с помощью работает без нареканий

Когда вы запускаете его как:

docker run -it --entrypoint /bin/sh -v $(pwd)/scripts/wait-for:/wait-for migrate/migrate:v4.7.0

точка входа /bin/sh

Когда вы запускаете его с использованием docker-compose:

точка входа (/bin/sh) + команда (./wait-for database:5432) ... `выполняется.

./wait-for database:5432 как целое означает исполняемый файл, который будет запущен и не может быть найден, поэтому вы получаете ошибку No such file or directory

Попробуйте указать абсолютный путь к wait-forв command: и разделить ./wait-for database:5432 на "./wait-for", "database:5432".

Возможно, что разделения будет достаточно

В качестве альтернативы вы можете следовать Синтаксис CMD docs и использоватьдругой синтаксис команды без массива: command: ./wait-for database:5432 ...

...