首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >/bin/sh:在设置停靠点时没有这样的文件或目录

/bin/sh:在设置停靠点时没有这样的文件或目录
EN

Stack Overflow用户
提问于 2019-10-26 11:44:56
回答 3查看 3.1K关注 0票数 3

我有一个运行数据库迁移(来源)的容器:

代码语言:javascript
复制
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"]

我想把它集成到一个坞-撰写,并使它依赖于Postgres数据库服务。但是,由于我必须等待数据库完全初始化,所以必须将migrate命令包装在脚本中,从而替换迁移容器的入口点。我使用等待-等待脚本轮询数据库,它是一个纯shell (而不是bash)脚本,因此应该在高寒容器中工作。

这是在docker-组合中定义服务的方式:

代码语言:javascript
复制
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失败

代码语言:javascript
复制
migration_1           | /bin/sh: can't open './wait-for database:5432': No such file or directory

为自己运行迁移容器

代码语言:javascript
复制
docker run -it --entrypoint /bin/sh -v $(pwd)/scripts/wait-for:/wait-for  migrate/migrate:v4.7.0

如果工作完美,脚本就在那里,可以用/bin/sh ./wait-for运行。

那么,为什么它作为对接组合的一部分失败了呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-26 14:23:34

如果仔细阅读错误消息,您将看到无法找到的文件不是./waitfor,而是./wait-for database:5432。这与您的输入文件是一致的,其中整个内容都是作为command列表的第一个元素给出的:

代码语言:javascript
复制
        command: ["./wait-for database:5432", "--", "./migrate", "-path", "/migrations", "-database", "postgres://test:test@database:5432/test?sslmode=disable",  "-verbose", "up"]

我不清楚你到底想要什么,因为提出的替代方案似乎并不完全类似,但可能是

代码语言:javascript
复制
        command: ["./wait-for", "database:5432", "--", "./migrate", "-path", "/migrations", "-database", "postgres://test:test@database:5432/test?sslmode=disable",  "-verbose", "up"]
票数 4
EN

Stack Overflow用户

发布于 2019-10-26 12:21:53

为自己运行迁移容器确实可以完美地工作。

当你像这样运行时:

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 ...

票数 0
EN

Stack Overflow用户

发布于 2022-01-04 21:36:32

ENTRYPOINT ["/bin/sh"]是不够的,您还需要-c参数。

示例(这里用docker-compose run --rm MYSERVICENAMEFROMTHEDOCKERCOMPOSEFILE bash测试一个docker-come.yml):

代码语言:javascript
复制
entrypoint: ["/bin/sh"]

抛出:

代码语言:javascript
复制
/bin/sh: 0: cannot open bash: No such file
ERROR: 2

和一些错误的语法示例,如

代码语言:javascript
复制
entrypoint: ["/bin/sh -c"]

(错了!)

代码语言:javascript
复制
entrypoint: ["/bin/sh, -c"]

(错了!)

抛错:

代码语言:javascript
复制
starting container process caused: exec: "/bin/sh, -c": stat /bin/sh, -c: no such file or directory: unknown
ERROR: 1


starting container process caused: exec: "/bin/sh -c": stat /bin/sh -c: no such file or directory: unknown
ERROR: 1

在Dockerfile或Dockerfile中,对于入口点,您需要-c参数。

这是对的:

代码语言:javascript
复制
entrypoint: "/bin/sh -c"

或者:

代码语言:javascript
复制
entrypoint: ["/bin/sh", "-c"]

-c将明确表示这是在命令行中执行的命令,等待在该命令行中使用额外的命令。但是不能单独启动bash /bin/sh。你可以在在Dockerfile中CMD和ENTRYPOINT之间有什么区别?的字里行间读到这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58570455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档