In this blog, we are going to see how to deploy the play framework application. And walks you through steps to create Dockerfile, Build and deploy the application.
We will display a Hello World greeting page. As an outcome.
Introduction
We all use the “sbt run” command to run the application in the development environment. However, we can not use the “run ” command in the production environment. As when a run command executes each request check with the “sbt” if any files have changed. And it impacts your application performance.
There are different ways to deploy the application, But here we see by creating the artifact using dist task.
The artifact can be created using several ways as follows
- ‘sbt package’ command
- ‘dist’ task
- Native packager
- ‘stage’ task
- sbt assembly plugin
Using dist task
Note: Before you run the application in a production environment you need to create the application secrete click here
Using the dist task it will create the binary version of your project so that you need only java to install to run. No need or dependency of sbt.
Steps
- Build your project artifact by entering ‘sbt dist’ command in your terminal. It will create the .zip artifact of your project in target/universal directory.
knoldus@knoldus-Vostro-15-3568:~/IdeaProjects/play-scala-hello-world-tutorial$ sbt dist
[info] Loading global plugins from /home/knoldus/.sbt/1.0/plugins
[info] Loading settings for project play-scala-hello-world-tutorial-build from plugins.sbt,scaffold.sbt ...
[info] Loading project definition from /home/knoldus/IdeaProjects/play-scala-hello-world-tutorial/project
[info] Loading settings for project root from build.sbt ...
[info] Set current project to play-scala-seed (in build file:/home/knoldus/IdeaProjects/play-scala-hello-world-tutorial/)
[info] Packaging /home/knoldus/IdeaProjects/play-scala-hello-world-tutorial/target/scala-2.12/play-scala-seed_2.12-1.0-SNAPSHOT-sources.jar ...
[info] Done packaging.
[info] Wrote /home/knoldus/IdeaProjects/play-scala-hello-world-tutorial/target/scala-2.12/play-scala-seed_2.12-1.0-SNAPSHOT.pom
[info] Main Scala API documentation to /home/knoldus/IdeaProjects/play-scala-hello-world-tutorial/target/scala-2.12/api...
[info] Packaging /home/knoldus/IdeaProjects/play-scala-hello-world-tutorial/target/scala-2.12/play-scala-seed_2.12-1.0-SNAPSHOT.jar ...
[info] Done packaging.
model contains 19 documentable templates
[info] Main Scala API documentation successful.
[info] Packaging /home/knoldus/IdeaProjects/play-scala-hello-world-tutorial/target/scala-2.12/play-scala-seed_2.12-1.0-SNAPSHOT-javadoc.jar ...
[info] Done packaging.
[warn] [1] The maintainer is empty
[warn] Add this to your build.sbt
[warn] maintainer := "your.name@company.org"
[success] All package validations passed
[info] Your package is ready in /home/knoldus/IdeaProjects/play-scala-hello-world-tutorial/target/universal/play-scala-seed-1.0-SNAPSHOT.zip
[success] Total time: 12 s, completed 12 Feb, 2020 11:33:34 PM
knoldus@knoldus-Vostro-15-3568:~/IdeaProjects/play-scala-hello-world-tutorial$
2. Extract the zip folder using unzip command. It unzips the folder in the same directory where the zip artifact is.
knoldus@knoldus-Vostro-15-3568:~/IdeaProjects/play-scala-hello-world-tutorial$ unzip target/universal/play-scala-seed-1.0-SNAPSHOT.zip
Archive: target/universal/play-scala-seed-1.0-SNAPSHOT.zip
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.example.play-scala-seed-1.0-SNAPSHOT-sans-externalized.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/org.scala-lang.scala-library-2.12.8.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.play.twirl-api_2.12-1.4.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/org.scala-lang.modules.scala-xml_2.12-1.1.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.play.play-server_2.12-2.7.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.play.play_2.12-2.7.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.play.build-link-2.7.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.play.play-exceptions-2.7.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.play.play-streams_2.12-2.7.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/org.reactivestreams.reactive-streams-1.0.2.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.akka.akka-stream_2.12-2.5.19.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.akka.akka-actor_2.12-2.5.19.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.config-1.3.3.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/org.scala-lang.modules.scala-java8-compat_2.12-0.9.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.akka.akka-protobuf_2.12-2.5.19.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.ssl-config-core_2.12-0.3.7.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/org.scala-lang.modules.scala-parser-combinators_2.12-1.1.1.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/org.slf4j.slf4j-api-1.7.25.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/org.slf4j.jul-to-slf4j-1.7.25.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/org.slf4j.jcl-over-slf4j-1.7.25.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.akka.akka-slf4j_2.12-2.5.19.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.fasterxml.jackson.core.jackson-core-2.9.8.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.fasterxml.jackson.core.jackson-annotations-2.9.8.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.fasterxml.jackson.core.jackson-databind-2.9.8.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.fasterxml.jackson.datatype.jackson-datatype-jdk8-2.9.8.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.fasterxml.jackson.datatype.jackson-datatype-jsr310-2.9.8.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.play.play-json_2.12-2.7.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.play.play-functional_2.12-2.7.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/org.scala-lang.scala-reflect-2.12.8.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/org.typelevel.macro-compat_2.12-1.1.1.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/org.scala-lang.modules.scala-collection-compat_2.12-0.1.1.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/joda-time.joda-time-2.10.1.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.google.guava.guava-27.0-jre.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.google.guava.failureaccess-1.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.google.guava.listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.google.code.findbugs.jsr305-3.0.2.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/org.checkerframework.checker-qual-2.5.2.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.google.errorprone.error_prone_annotations-2.2.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.google.j2objc.j2objc-annotations-1.1.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/org.codehaus.mojo.animal-sniffer-annotations-1.17.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/io.jsonwebtoken.jjwt-0.9.1.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/javax.xml.bind.jaxb-api-2.3.1.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/javax.activation.javax.activation-api-1.2.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/javax.transaction.jta-1.1.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/javax.inject.javax.inject-1.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.play.play-logback_2.12-2.7.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/ch.qos.logback.logback-classic-1.2.3.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/ch.qos.logback.logback-core-1.2.3.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.play.play-akka-http-server_2.12-2.7.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.akka.akka-http-core_2.12-10.1.7.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.akka.akka-parsing_2.12-10.1.7.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.play.filters-helpers_2.12-2.7.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.typesafe.play.play-guice_2.12-2.7.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.google.inject.guice-4.2.2.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/aopalliance.aopalliance-1.0.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.google.inject.extensions.guice-assistedinject-4.2.2.jar
inflating: play-scala-seed-1.0-SNAPSHOT/lib/com.example.play-scala-seed-1.0-SNAPSHOT-assets.jar
inflating: play-scala-seed-1.0-SNAPSHOT/bin/play-scala-seed
inflating: play-scala-seed-1.0-SNAPSHOT/bin/play-scala-seed.bat
inflating: play-scala-seed-1.0-SNAPSHOT/conf/logback.xml
inflating: play-scala-seed-1.0-SNAPSHOT/conf/application.conf
inflating: play-scala-seed-1.0-SNAPSHOT/conf/messages
inflating: play-scala-seed-1.0-SNAPSHOT/conf/routes
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/open-sans-v13-latin-700.woff
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/abstract_type.svg
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/package.svg
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/MaterialIcons-Regular.eot
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/jquery.panzoom.min.js
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/lato-v11-latin-100.eot
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/object_comp_trait.svg
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/open-sans-v13-latin-regular.ttf
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/index.js
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/open-sans-v13-latin-700.ttf
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/lato-v11-latin-regular.ttf
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/class_diagram.png
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/trait_comp.svg
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/open-sans-v13-latin-700.eot
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/ownerbg.gif
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/source-code-pro-v6-latin-regular.eot
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/object_diagram.png
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/object.svg
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/open-sans-v13-latin-400i.ttf
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/source-code-pro-v6-latin-700.woff
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/class_comp.svg
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/diagrams.js
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/open-sans-v13-latin-400i.eot
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/lato-v11-latin-regular.woff
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/source-code-pro-v6-latin-700.ttf
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/type_diagram.png
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/jquery.js
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/ref-index.css
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/ownderbg2.gif
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/tools.tooltip.js
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/open-sans-v13-latin-700i.ttf
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/open-sans-v13-latin-400i.woff
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/ownerbg2.gif
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/open-sans-v13-latin-700i.eot
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/source-code-pro-v6-latin-regular.woff
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/open-sans-v13-latin-regular.woff
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/index.css
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/modernizr.custom.js
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/jquery.mousewheel.min.js
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/trait_diagram.png
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/open-sans-v13-latin-700i.woff
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/MaterialIcons-Regular.ttf
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/source-code-pro-v6-latin-700.eot
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/template.js
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/MaterialIcons-Regular.woff
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/lato-v11-latin-100.ttf
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/source-code-pro-v6-latin-regular.ttf
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/class.svg
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/lato-v11-latin-100.woff
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/template.css
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/object_comp.svg
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/lato-v11-latin-regular.eot
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/trait.svg
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/scheduler.js
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/open-sans-v13-latin-regular.eot
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/lib/diagrams.css
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/index.js
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/controllers/routes.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/controllers/ReverseHomeController.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/controllers/javascript/ReverseHomeController.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/controllers/javascript/ReverseAssets.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/controllers/javascript/index.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/controllers/HomeController.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/controllers/ReverseAssets.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/controllers/index.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/router/RoutesPrefix$.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/router/Routes.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/router/index.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/index.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/views/html/commonSidebar$.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/views/html/explore$.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/views/html/index$.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/views/html/tutorial$.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/views/html/index.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/views/html/main$.html
inflating: play-scala-seed-1.0-SNAPSHOT/share/doc/api/views/index.html
inflating: play-scala-seed-1.0-SNAPSHOT/README.md
3. After creating extracting the zip artifact run the script file present in bin directory. There are two versions of script present
- 1 bash shell script(Linux, Ubuntu)
- 2 .bat(is present for windows)
./target/universal/play-scala-seed-1.0-SNAPSHOT/bin/play-scala-seed
Oops, cannot start the server.
Configuration error: Configuration error[
The application secret has not been set, and we are in prod mode. Your application is not secure.
To set the application secret, please read http://playframework.com/documentation/latest/ApplicationSecret
]
at play.api.Configuration$.configError(Configuration.scala:158)
at play.api.Configuration.reportError(Configuration.scala:992)
at play.api.http.HttpConfiguration$.getSecretConfiguration(HttpConfiguration.scala:280)
at play.api.http.HttpConfiguration$.fromConfiguration(HttpConfiguration.scala:266)
at play.api.http.HttpConfiguration$HttpConfigurationProvider.get$lzycompute(HttpConfiguration.scala:354)
at play.api.http.HttpConfiguration$HttpConfigurationProvider.get(HttpConfiguration.scala:354)
at play.api.http.HttpConfiguration$HttpConfigurationProvider.get(HttpConfiguration.scala:353)
at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:85)
at com.google.inject.internal.BoundProviderFactory.provision(BoundProviderFactory.java:77)
at com.google.inject.internal.ProviderInternalFactory.circularGet(ProviderInternalFactory.java:59)
at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:61)
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:42)
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:65)
at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:113)
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:306)
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:168)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:39)
at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:60)
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:42)
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:65)
at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:113)
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:306)
at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:62)
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:42)
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:65)
at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:113)
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:306)
at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:62)
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:42)
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:65)
at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:113)
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:306)
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:168)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:39)
at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:62)
at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:211)
at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:182)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:109)
at com.google.inject.Guice.createInjector(Guice.java:87)
at com.google.inject.Guice.createInjector(Guice.java:78)
at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:186)
at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:139)
at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
at play.core.server.ProdServerStart$.start(ProdServerStart.scala:57)
at play.core.server.ProdServerStart$.main(ProdServerStart.scala:29)
at play.core.server.ProdServerStart.main(ProdServerStart.scala)
Now here you can see it shows the error if I am not providing the application secrete. So it is necessary to provide the application secrete when running in the production environment.
4. Run using the following command
sbt -Dplay.http.secret.key=ad31779d4ee49d5ad5162bf1429c32e2e9933f3b
[info] play.api.Play - Application started (Prod) (no global state)
[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
Now here the application is running successfully and you see the output by bowsing the localhost:9000
Containerized a play application
- Copy all the above steps in a Dockerfile(Create a Dockerfile)
Dockerfile
FROM openjdk:8-jre-alpine
WORKDIR /play-scala-hello-world
RUN apk --no-cache add bash
RUN ls -a
COPY ./target/universal/play-scala-seed-1.0-SNAPSHOT.zip .
RUN ls -a
RUN unzip play-scala-seed-1.0-SNAPSHOT && rm play-scala-seed-1.0-SNAPSHOT.zip
CMD ./play-scala-seed-1.0-SNAPSHOT/bin/play-scala-seed -Dplay.http.secret.key='QCY?tAnfk?aZ?iwrNwnxIlR6CTf:G3gf:90Latabg@5241AB`R5W:1uDFN];Ik@n'
Here we use base image of OpenJDK , which we already stated we only need java.
2. Build Dockerfile ( it creates an image with the tag you provided)
sudo docker build -t play-scala-application .
Sending build context to Docker daemon 152.6MB
Step 1/8 : FROM openjdk:8-jre-alpine
---> f7a292bbb70c
Step 2/8 : WORKDIR /play-scala-hello-world
---> Using cache
---> d2f45b7b811a
Step 3/8 : RUN apk --no-cache add bash
---> Using cache
---> edb71c68854c
Step 4/8 : RUN ls -a
---> Using cache
---> 56f1fafe96c1
Step 5/8 : COPY ./target/universal/play-scala-seed-1.0-SNAPSHOT.zip .
---> Using cache
---> 548a68e718cc
Step 6/8 : RUN ls -a
---> Using cache
---> cc0f914070fa
Step 7/8 : RUN unzip play-scala-seed-1.0-SNAPSHOT && rm play-scala-seed-1.0-SNAPSHOT.zip
---> Using cache
---> dbaea0dbfa2a
Step 8/8 : CMD ./play-scala-seed-1.0-SNAPSHOT/bin/play-scala-seed -Dplay.http.secret.key='QCY?tAnfk?aZ?iwrNwnxIlR6CTf:G3gf:90Latabg@5241AB`R5W:1uDFN];Ik@n'
---> Using cache
---> a88bcc5f0591
Successfully built a88bcc5f0591
Successfully tagged play-scala-application:latest
3. Run the image on the port 9000 as the play by defaults run on 9000 port.
sudo docker run -p 9000 play-scala-application:latest
[info] play.api.Play - Application started (Prod) (no global state)
[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0.0.0.0:9000
4. Open localhost:9000 (you will see->)
In this example we created the zip artifact f the project, we can also create the jar artifact. Learn how to create .jar Here