我有一个运行数据库迁移(来源)的容器:
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-组合中定义服务的方式:
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运行。
那么,为什么它作为对接组合的一部分失败了呢?
发布于 2019-10-26 14:23:34
如果仔细阅读错误消息,您将看到无法找到的文件不是./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"]发布于 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 ...
发布于 2022-01-04 21:36:32
ENTRYPOINT ["/bin/sh"]是不够的,您还需要-c参数。
示例(这里用docker-compose run --rm MYSERVICENAMEFROMTHEDOCKERCOMPOSEFILE bash测试一个docker-come.yml):
entrypoint: ["/bin/sh"]抛出:
/bin/sh: 0: cannot open bash: No such file
ERROR: 2和一些错误的语法示例,如
entrypoint: ["/bin/sh -c"](错了!)
或
entrypoint: ["/bin/sh, -c"](错了!)
抛错:
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参数。
这是对的:
entrypoint: "/bin/sh -c"或者:
entrypoint: ["/bin/sh", "-c"]-c将明确表示这是在命令行中执行的命令,等待在该命令行中使用额外的命令。但是不能单独启动bash /bin/sh。你可以在在Dockerfile中CMD和ENTRYPOINT之间有什么区别?的字里行间读到这一点。
https://stackoverflow.com/questions/58570455
复制相似问题