sbt 本地打包器 dockerCommands 复制
sbt native packager dockerCommands copy
在互联网和此处搜索,但找不到解决我问题的答案。
我的问题是我想创建一个 docker 图像,其中包含从本地文件系统复制到 docker 图像的一些自定义 sql 脚本。
目录结构(一个多模块项目)是
my_sbt
+ my_app
- build.sbt ...
+ database
- build.sbt
+ scripts
- ... several sql scripts ...
database/build.sbt 包含 docker 命令
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 语句添加到 docker 命令会使构建过程崩溃 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.apply(DockerPlugin.scala:119)
at com.typesafe.sbt.packager.docker.DockerPlugin$$anonfun$projectSettings.apply(DockerPlugin.scala:117)
...
运行 sbt with -d sbt -d docker:publishLocal
没有帮助,因为它仍然抛出 Nonzero exit value: 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 的 link 解决了我的问题。
问题基本上来自 docker 将本地文件关联到 docker 容器的间接方式。
sbt native packager 根据 Universal 部分中的 mappings 将本地文件复制到 target/docker/stage。例如,下面的代码片段将 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 然后根据 dockerCommands 将位于 target/docker/stage/ 的文件复制到 docker 容器s Cmd("COPY", "/opt/docker/scripts/a.sql", "/docker-entrypoint-initdb.d")
所以 The <src> path must be inside the context of the build; ...
上下文实际上是从 target/docker/stage/ 开始的。
在互联网和此处搜索,但找不到解决我问题的答案。
我的问题是我想创建一个 docker 图像,其中包含从本地文件系统复制到 docker 图像的一些自定义 sql 脚本。
目录结构(一个多模块项目)是
my_sbt
+ my_app
- build.sbt ...
+ database
- build.sbt
+ scripts
- ... several sql scripts ...
database/build.sbt 包含 docker 命令
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 语句添加到 docker 命令会使构建过程崩溃 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.apply(DockerPlugin.scala:119)
at com.typesafe.sbt.packager.docker.DockerPlugin$$anonfun$projectSettings.apply(DockerPlugin.scala:117)
...
运行 sbt with -d sbt -d docker:publishLocal
没有帮助,因为它仍然抛出 Nonzero exit value: 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 的 link 解决了我的问题。
问题基本上来自 docker 将本地文件关联到 docker 容器的间接方式。
sbt native packager 根据 Universal 部分中的 mappings 将本地文件复制到 target/docker/stage。例如,下面的代码片段将 a.sql 复制到项目目录
下的 target/docker/stage/opt/docker/scriptsmappings in Universal := { (mappings in Universal).value :+ (file(s"${baseDirectory.value}/scripts/a.sql") -> "scripts/a.sql") }
sbt native packager 然后根据 dockerCommands 将位于 target/docker/stage/ 的文件复制到 docker 容器s
Cmd("COPY", "/opt/docker/scripts/a.sql", "/docker-entrypoint-initdb.d")
所以 The <src> path must be inside the context of the build; ...
上下文实际上是从 target/docker/stage/ 开始的。