gpt4 book ai didi

docker - sbt 原生打包器 dockerCommands 复制

转载 作者:行者123 更新时间:2023-12-02 20:05:21 25 4
gpt4 key购买 nike

在互联网上搜索,在这里,但找不到解决我问题的答案。

我的问题是我想用一些从本地文件系统复制到 docker 镜像的自定义 sql 脚本创建一个 docker 镜像。

目录结构(一个多模块项目)是

my_sbt
+ my_app
- build.sbt ...
+ database
- build.sbt
+ scripts
- ... several sql scripts ...

database/build.sbt 包含 dockerCommands
dockerCommands := Seq(
Cmd("FROM", "postgres:9.5"),
Cmd("EXPOSE", "5432"),
Cmd("COPY", (baseDirectory.value / "database" / "scripts" / "a.sql").toPath.toAbsolutePath.toString, "/docker-entrypoint-initdb.d/a.sql")
)

如果没有 COPY Cmd,则可以成功创建镜像(即 docker run -d --rm -p 5432:5432 <docker image> 启动容器, docker exec -it <container id> bash 可以 bash 到容器并验证处理是否由 ps -ef 在容器 bash 中运行)。但是,将 COPY 语句添加到 dockerCommands 会使构建过程崩溃 sbt docker:publishLocal出现错误 java.lang.RuntimeException:非零退出值:1
java.lang.RuntimeException: Nonzero exit value: 1
at com.typesafe.sbt.packager.docker.DockerPlugin$.publishLocalDocker(DockerPlugin.scala:335)
at com.typesafe.sbt.packager.docker.DockerPlugin$$anonfun$projectSettings$22.apply(DockerPlugin.scala:119)
at com.typesafe.sbt.packager.docker.DockerPlugin$$anonfun$projectSettings$22.apply(DockerPlugin.scala:117)
...

使用 运行 sbt -d sbt -d docker:publishLocal没有帮助,因为它仍然抛出 非零退出值:1 ,这根本没有帮助。

引用本地脚本并将其复制到 docker 镜像的正确方法是什么?

谢谢

编辑:
  • 请注意,sbt native packager 似乎去掉了前导根路径,即“/”。有什么理由这样做吗?以及如何防止导致/从剥离?
    [info] Step 3/3 : COPY /path/to/database/scripts/users.sql /docker-entrypoint-initdb.d/users.sql
    [error] lstat path/to/database/scripts/users.sql: no such file or directory
  • 最佳答案

    https://serverfault.com/questions/666149/docker-copy-issue-no-such-file-or-directory/666154#666154上的链接解决了我的问题。

    基本上问题来自docker将本地文件关联到docker容器的间接方式。

  • sbt native packager 根据 将本地文件复制到 target/docker/stage Universal 中的映射 部分。例如,下面的代码片段将 a.sql 复制到项目目录下的 target/docker/stage/opt/docker/scripts
    mappings in Universal := {
    (mappings in Universal).value :+
    (file(s"${baseDirectory.value}/scripts/a.sql") -> "scripts/a.sql")
    }
  • sbt native packager 然后将位于 target/docker/stage/的文件复制到基于 的 docker 容器dockerCommands Cmd("COPY", "/opt/docker/scripts/a.sql", "/docker-entrypoint-initdb.d")

  • 所以 The <src> path must be inside the context of the build; ...上下文实际上从 开始目标/docker/舞台/ .

    关于docker - sbt 原生打包器 dockerCommands 复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50253875/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com