sbt-native-packager 的 docker:publishLocal 有啥作用?

Posted

技术标签:

【中文标题】sbt-native-packager 的 docker:publishLocal 有啥作用?【英文标题】:What does sbt-native-packager's docker:publishLocal do?sbt-native-packager 的 docker:publishLocal 有什么作用? 【发布时间】:2014-09-10 05:32:26 【问题描述】:

The docs说:

要构建映像并将其存储在本地 Docker 服务器中,请使用

docker:publishLocal

我刚刚开始使用 Docker,对“本地 Docker 服务器”的概念并不熟悉。那是什么,我应该在哪里寻找docker:publishLocal 的输出?

【问题讨论】:

【参考方案1】:

Docker 服务器

Docker的主要组件描述在这里:https://docs.docker.com/introduction/understanding-docker/#what-are-the-major-docker-components

所谓的“Docker 服务器”是链接描述中的“Docker 守护进程”。 Docker 守护程序在您的本地计算机上运行,​​通常是由docker 二进制文件运行的命令的主要联系点。

Docker 守护进程执行许多任务,包括:

启动容器 停止容器 查询容器状态 构建映像(容器的“文件系统”) 将图像推送到 Docker 索引或其他图像服务器 (使图像从您的构建机器外部可见) 管理容器,如果它们停止则重新启动它们

sbt-native-packager 任务到 Docker 操作的映射

发布本地

SBT 使用名为 publishLocal 的任务将资产发布到本地 Ivy/Maven 存储库(这仅存在于您的计算机上)。

sbt-native-packager 中的 Docker 支持尝试在 Docker 上下文中使用相同的任务,以便 sbt docker:publishLocal 在本地 Docker 服务器上构建映像。就像在本地发布到 Ivy 或 Maven 一样,此操作允许图像在本地可见以进行开发,但不会使其在本地计算机之外可见。

实际上,它映射到命令docker build -t "$projectName:$version"

然后您可以将此图像与docker run "$projectName:$version" 一起使用,但在您的本地计算机上。

发布

SBT 使用名为 publish 的任务将资产发布到远程 Ivy/Maven 存储库。这需要额外的配置,以描述在哪里发布图像。

sbt-native-packager 还尝试将此任务映射到 Docker 上下文中的适当操作。因此插件会在本地构建图像,然后将图像推送到适当的远程图像存储库。

为此,您需要添加dockerRepository 设置。

如果设置为不带斜线的字符串,例如“username1”,这会将“username1/”添加到图像名称中。当尝试推送镜像时,Docker 会尝试将镜像推送到“username1”账户中https://registry.hub.docker.com/ 的公共 Docker 注册表。

如果它设置为带有斜杠的字符串,例如“my.server1/username1”,这也会将该字符串添加到图像名称中。这与前一种情况类似,只是 Docker 服务器会尝试在 DNS 中查找名为“my.server1”的服务器,并推送到该服务器而不是公共 Docker 注册表。

实际上,它映射到

docker build -t "$dockerRepository/$projectName:$version" . // working directory at `target/docker/stage` docker push "$dockerRepository/$projectName:$version"

然后,您可以通过docker run "$dockerRepository/$projectName:$version" 使用本地计算机或其他计算机中的此映像。

舞台

stage 任务会创建一个目录,其中包含 Docker 映像的所有文件,格式可以发送到您的 Docker 守护程序。这个目录是target/docker/stage。如果您将工作目录更改为此处并运行docker build .,您将使用该目录的内容构建映像。

【讨论】:

" Docker 将尝试将映像推送到公共 Docker 注册表 " 如何将其推送到私有存储库? 它只是使用底层的docker push 命令,所以如果你之前登录过你的Docker 账户(docker login),它应该可以工作。通过 SBT 配置进行的身份验证被忽略了,因为(当时)似乎不可能在不更改 SBT 外部状态的情况下进行身份验证。 我刚刚在我的项目中尝试过这个,可能我使用的是不同版本的 SBT Docker 插件,但我的 Docker 文件生成到target/docker/stage,而不是target/docker。我在两者中都尝试了docker build .,但只有target/docker/stage 有效。 在github.com/sbt/sbt-native-packager/commit/5d703a5ccc1e7a2(2014 年 12 月)中似乎发生了这种变化。我会更新的。【参考方案2】:

找到the source code。似乎docker:publishLocal 映射到docker build -t [dockerTarget]

我正在使用 Play 2.3,从源代码显示当前正在使用 sbt-native-packager 0.7.1。我不确定如何从 SBT 控制台确认这是我实际使用的版本。 Docker 支持是在 0.7.2 中添加的,所以我想这就是我看不到任何事情发生的原因。在 0.7.1 中似乎什么也不做。我不确定为什么会这样。我预计它会失败或其他什么。

提交了change to upgrade Play to 0.7.2,尽管它比我预期的要困难。使用 sbt-native-packager 0.7.2,我现在看到一些输出位于 target/docker/

【讨论】:

在 sbt shell 中,使用libraryDependencies 查看项目的依赖关系。插件也出现在那里,因为它们最终在 Plugin 配置下。 感谢 Jacek 的提示!! 我可以使用sbt docker:publishLocal然后docker push.travis-ci.yml中发布到远程存储库:github.com/felipegutierrez/explore-akka/blob/master/build.sbt

以上是关于sbt-native-packager 的 docker:publishLocal 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 sbt-native-packager 不生成 bin 目录?

扩展 sbt-native-packager (Docker)

发布 sbt-native-packager 创建的 zip

使用 sbt-native-packager 时的模糊参考

任何使用 sbt-native-packager 的好例子

使用 sbt-native-packager 时的配置目录