2

我正在尝试在 Play 2.2 项目上构建 Docker 映像。我在 Ubuntu Linux 上使用 Docker 版本 1.2.0。

我在 Build.scala 中的 Docker 特定设置如下所示:

dockerBaseImage in Docker := "dockerfile/java:7"
maintainer in Docker := "My name"
dockerExposedPorts in Docker := Seq(9000, 9443)
dockerExposedVolumes in Docker := Seq("/opt/docker/logs")

生成的 Dockerfile:

FROM dockerfile/java:latest
MAINTAINER 
ADD files /
WORKDIR /opt/docker
RUN ["chown", "-R", "daemon", "."]
USER daemon
ENTRYPOINT ["bin/device-guides"]
CMD []

输出看起来像 dockerBaseImage 被忽略了,默认

(dockerfile/java:latest) is not handled correctly:
[project] $ docker:publishLocal
[info] Wrote /..../project.pom
[info] Step 0 : FROM dockerfile/java:latest
[info]  ---> bf7307ff060a
[info] Step 1 : MAINTAINER
[error] 2014/10/07 11:30:12 Invalid Dockerfile format
[trace] Stack trace suppressed: run last docker:publishLocal for the full output.
[error] (docker:publishLocal) Nonzero exit value: 1
[error] Total time: 2 s, completed Oct 7, 2014 11:30:12 AM
[project] $ run last docker:publishLocal
java.lang.RuntimeException: Invalid port argument: last
    at scala.sys.package$.error(package.scala:27)
    at play.PlayRun$class.play$PlayRun$$parsePort(PlayRun.scala:52)
    at play.PlayRun$$anonfun$play$PlayRun$$filterArgs$2.apply(PlayRun.scala:69)
    at play.PlayRun$$anonfun$play$PlayRun$$filterArgs$2.apply(PlayRun.scala:69)
    at scala.Option.map(Option.scala:145)
    at play.PlayRun$class.play$PlayRun$$filterArgs(PlayRun.scala:69)
    at play.PlayRun$$anonfun$playRunTask$1$$anonfun$apply$1.apply(PlayRun.scala:97)
    at play.PlayRun$$anonfun$playRunTask$1$$anonfun$apply$1.apply(PlayRun.scala:91)
    at scala.Function7$$anonfun$tupled$1.apply(Function7.scala:35)
    at scala.Function7$$anonfun$tupled$1.apply(Function7.scala:34)
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) Invalid port argument: last
[error] Total time: 0 s, completed Oct 7, 2014 11:30:16 AM

需要做些什么来完成这项工作?

我可以从命令行使用 Docker 构建映像:

docker build --force-rm -t device-guides:1.0-SNAPSHOT .
4

2 回答 2

2

打包/发布设置是每个项目的设置,而不是每个构建的设置。

您正在使用Build.scala样式构建,格式如下:

object ApplicationBuild extends Build { val main = play.Project(appName, appVersion, libraryDependencies).settings( ... ) }

这些设置应应用于此main项目。这意味着您调用settings()项目上的方法,传入适当的设置以根据需要设置打包。

在这种情况下:

object ApplicationBuild extends Build { val main = play.Project(appName, appVersion, libraryDependencies).settings( dockerBaseImage in Docker := "dockerfile/java:7", maintainer in Docker := "My name", dockerExposedPorts in Docker := Seq(9000, 9443), dockerExposedVolumes in Docker := Seq("/opt/docker/logs") ) }

要在多个项目中重复使用类似的设置,您可以创建一个 type 的 val Seq[sbt.Setting],或者进行扩展sbt.Project以提供通用设置。有关如何执行此操作的一些示例,请参见http://jsuereth.com/scala/2013/06/11/effective-sbt.html (例如规则 #4)。

如果习惯于使用 -type 构建,则这种设置的放置不一定清楚build.sbt,因为在该文件中,评估为 SBT 设置(或设置序列)的行会自动附加到根项目的设置中。

于 2014-10-26T11:21:03.193 回答
1

这是您执行的错误命令。我没有第一次看到它。

run last docker:publishLocal

删除最后运行

docker:publishLocal

现在您按预期获得了 docker 映像构建

于 2014-10-11T17:59:42.833 回答