在Play JPA项目中使用sbt-native-packager将自定义文件夹添加到Docker

我正在开发一个JPA + Playframework 2.5.x项目,将其打包为Docker镜像。

我想强制添加除conf文件夹下的一个文件(META-INF / persistence.xml)到docker输出的所有文件

目前我做了以下工作:

 mappings in Docker += file("conf/base/application.conf") -> "opt/docker/conf/base/application.conf" mappings in Docker += file("conf/base/default-client.conf") -> "opt/docker/conf/base/default-client.conf" mappings in Docker += file("conf/prod/application.conf") -> "opt/docker/conf/prod/application.conf" mappings in Docker += file("conf/prod/logback.xml") -> "opt/docker/conf/prod/logback.xml" mappings in Docker += file("conf/stage/application.conf") -> "opt/docker/conf/stage/application.conf" mappings in Docker += file("conf/stage/logback.xml") -> "opt/docker/conf/stage/logback.xml" mappings in Docker += file("conf/local/application.conf") -> "opt/docker/conf/local/application.conf" mappings in Docker += file("conf/local/logback.xml") -> "opt/docker/conf/local/logback.xml" mappings in Docker += file("conf/routes") -> "opt/docker/conf/routes" mappings in Docker += file("conf/ValidationMessages.properties") -> "opt/docker/conf/ValidationMessages.properties" 

我相信这不是实现这个目标的最好方法。 任何人都可以build议更好的select,以我需要的方式定制Docker输出?

我的build.sbt文件:

 PlayKeys.externalizeResources := false name := """wp-pw-ng""" version := "1.0.0-SNAPSHOT" lazy val `wp-pw-ng` = (project in file(".")).enablePlugins(PlayJava, JavaAppPackaging) val playVer = "2.5.9" scalaVersion := "2.11.8" libraryDependencies ++= Seq( javaJpa, "org.hibernate" % "hibernate-core" % "5.2.3.Final" exclude("dom4j", "dom4j"), "mysql" % "mysql-connector-java" % "6.0.5", cache, javaWs, filters, "dom4j" % "dom4j" % "1.6", "com.google.guava" % "guava" % "20.0-rc1", "com.amazonaws" % "aws-java-sdk" % "1.11.34" ) val docDeps = Seq( "io.swagger" %% "swagger-play2" % "1.5.3.2" ) libraryDependencies ++= docDeps fork in Test := true javaOptions in Test ++= Seq( "-Xms512M", "-Xmx1536M", "-Xss1M", "-XX:MaxPermSize=384M" ) fork in run := false unmanagedResourceDirectories in Compile <+= (sourceDirectory in Compile) (_ / "resources") mappings in Docker += file("conf/base/application.conf") -> "opt/docker/conf/base/application.conf" mappings in Docker += file("conf/base/default-client.conf") -> "opt/docker/conf/base/default-client.conf" mappings in Docker += file("conf/base/pw.conf") -> "opt/docker/conf/base/paywall.conf" mappings in Docker += file("conf/prod/application.conf") -> "opt/docker/conf/prod/application.conf" mappings in Docker += file("conf/prod/logback.xml") -> "opt/docker/conf/prod/logback.xml" mappings in Docker += file("conf/stage/application.conf") -> "opt/docker/conf/stage/application.conf" mappings in Docker += file("conf/stage/logback.xml") -> "opt/docker/conf/stage/logback.xml" mappings in Docker += file("conf/local/application.conf") -> "opt/docker/conf/local/application.conf" mappings in Docker += file("conf/local/logback.xml") -> "opt/docker/conf/local/logback.xml" mappings in Docker += file("conf/routes") -> "opt/docker/conf/routes" mappings in Docker += file("conf/ValidationMessages.properties") -> "opt/docker/conf/ValidationMessages.properties" //************************************************ // Custom Docker Build, // use command 'activator docker:publishLocal' // to publish image locally to computer. //************************************************ import com.typesafe.sbt.packager.docker._ val playUser = "play" val grp = "idud" dockerRepository := Some("quay.io/we") version in Docker := "latest" val buildEnv: String = System.getProperty("build.env") dockerCommands := Seq( Cmd("FROM", "anapsix/alpine-java:8_jdk_unlimited"), Cmd("RUN", "apk", "-Uuv add", "--no-cache", "su-exec", "groff", "less", "python", "py-pip", "&& pip install awscli ", "&& apk --purge -v del py-pip ", " && rm /var/cache/apk/* "), Cmd("RUN", s"addgroup $grp"), Cmd("RUN", s"adduser -s /bin/bash -D -G $grp $playUser"), Cmd("RUN", "echo", s"'$playUser ALL=(ALL) NOPASSWD:ALL'", ">> /etc/sudoers"), Cmd("WORKDIR", "/opt/docker"), Cmd("ADD", "opt /opt"), Cmd("RUN", "chown", "-R", s"$playUser:$grp", "."), Cmd("USER", s"$playUser"), Cmd("ENTRYPOINT", "[\"bin/wp-pw-ng\", \"-Dconfig.file=conf/" + buildEnv + "/application.conf\", \"-Dhttp.port=7000\" , \"-Dpidfile.path=/dev/null\" ,\"-Dlogger.file=conf/" + buildEnv + "/logback.xml\"]"), Cmd("EXPOSE", "9877") ) 

额外的信息我不得不采取这个解决方法,因为与Playframework, 问题4590构buildstage模式问题,我不得不在我的build.sbt文件中使用PlayKeys.externalizeResources := false标志。 这将从Docker中的conf文件夹中删除所有文件。

playExternalizeResources:= false设置只是防止sbtfrom将playExternalizedResources添加到mappings in Universal中的映射,这是所有目标包格式(包括docker)可用的映射。

您的构buildsbt可以轻松与MappingsHelper ( ScalaDocs )

 import NativePackagerHelper._ mappings in Universal ++= contentOf("conf") 

您也可以过滤映射来删除不需要的文件,例如

 import NativePackagerHelper._ mappings in Universal ++= contentOf("conf").filter(_.2.contains("persistence.xml") 

希望有帮助,Muki

只需在universal/conf目录中添加要映射的文件即可。 因此,当您创buildDocker镜像时,文件将被添加到/opt/docker/conf目录中。