簡體   English   中英

/bin/sh:設置 docker-compose 入口點時沒有這樣的文件或目錄

[英]/bin/sh: No such file or directory when setting a docker-compose entrypoint

我有一個運行數據庫遷移的容器( 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命令包裝在腳本中,從而替換遷移容器的入口點。 我正在使用等待腳本來輪詢數據庫,這是一個純 shell(不是 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 的一部分會失敗呢?

如果你仔細閱讀錯誤信息,你會發現找不到的文件不是./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"]

為自己運行遷移容器確實可以完美地工作

當你像這樣運行它時:

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 語法文檔並使用不帶數組的不同命令語法: command: ./wait-for database:5432...

不要在 docker-compose.yml 中使用ENTRYPOINT ["/migrate"] 入口點的方括號只能在 Dockerfile 中使用。

例子:

entrypoint: ["/bin/sh"]

乃至

entrypoint: ["/bin/sh -c"]

拋出錯誤。

不需要方括號(它們是錯誤的)並且您需要-c參數。

這是正確的:

entrypoint: "/bin/sh -c"

-c是為了明確這是在命令行中執行的命令,等待在該命令行中使用其他命令。 但不能單獨啟動 bash /bin/sh 您可以在What is the difference between CMD and ENTRYPOINT in a Dockerfile? .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM