sbt-native-packager的docker:publishLocal命令是用来做什么的?

19

文档说:

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

docker:publishLocal

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

2个回答

33

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操作的映射

publishLocal

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

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

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

然后,您可以使用docker run "${projectName}:${version}"来使用此镜像,但仅限于您的本地计算机。

publish

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

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

为使其工作,您需要添加dockerRepository设置。

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

如果设置为带有斜杠的字符串,例如 "my.server1/username1",则会将该字符串添加到镜像名称中。这类似于前面的情况,但 Docker 服务器将尝试在 DNS 中查找名为 "my.server1" 的服务器,并将其推送到该服务器而不是公共 Docker 注册表。
实际上,它映射到
docker build -t "${dockerRepository}/${projectName}:${version}" . // 工作目录为 `target/docker/stage` docker push "${dockerRepository}/${projectName}:${version}"
然后您可以使用 docker run "${dockerRepository}/${projectName}:${version}" 从本地计算机或其他计算机中使用此镜像。
stage 任务创建一个目录,其中包含 Docker 镜像的所有文件,以准备发送到 Docker 守护程序的格式。该目录为 target/docker/stage。如果您将工作目录更改为此处并运行 docker build .,则会使用该目录的内容构建一个镜像。

1
Docker将尝试将镜像推送到公共Docker注册表。如何将其推送到私有存储库? - Vamsi
它只是使用底层的 docker push 命令,因此如果您之前已登录到 Docker 帐户 (docker login),它应该可以正常工作。通过 SBT 配置进行身份验证被忽略了,因为似乎在不改变 SBT 外部状态的情况下进行身份验证是不可能的(当时)。 - Gary Coady
我刚在我的项目中尝试了这个,也许我使用的是不同版本的SBT Docker插件,但我的Docker文件生成到target/docker/stage而不是target/docker。我在两个目录下都尝试了docker build .,只有target/docker/stage有效。 - Andrew Swan
看起来这个在 https://github.com/sbt/sbt-native-packager/commit/5d703a5ccc1e7a2(2014年12月)中有所改变。我会更新的。 - Gary Coady

1

找到了 源代码。看起来 docker:publishLocal 对应的是 docker build -t [dockerTarget]

我正在使用 Play 2.3,从源代码中可以看出它当前正在使用 sbt-native-packager 0.7.1。我不确定如何从 SBT 控制台确认我实际使用的版本。Docker 支持是在 0.7.2 中添加的,所以我猜这就是为什么我什么也没看到的原因。在 0.7.1 中似乎默默地什么都没做。我不知道这是为什么。我希望它能够失败或者给出一些提示。

提交了一个更新 Play 到 0.7.2 的更改,但比我预期的要困难得多。使用 sbt-native-packager 0.7.2,我现在可以看到位于 target/docker/ 目录下的一些输出


当您在sbt shell中时,请使用libraryDependencies查看项目的依赖项。插件也会出现在那里,因为它们最终位于“Plugin”配置下。 - Jacek Laskowski
谢谢你的提示,Jacek!! - Ben McCann
我可以使用sbt docker:publishLocal将其发布到远程仓库,然后在.travis-ci.yml内部使用docker push进行推送:https://github.com/felipegutierrez/explore-akka/blob/master/build.sbt - Felipe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接