跳至主要内容

Docker multi-stage builds

Docker multi-stage builds

Docker 17.06 introduced a new feature, Multi-stage builds, check the Docker blog entry multi stage builds or new multistage builds section in the docker official documentation for more details.

I tried to add a multi-stage Dockefile to build my sample project angularjs-springmvc-sample-boot into Docker images and run it in Docker container.

FROM node:latest AS ui
WORKDIR /usr/src/ui
COPY package.json .
# Setup NPM mirror, optionally for China users.
# RUN npm config set registry https://registry.npm.taobao.org/ 
RUN npm install 
COPY . .
RUN node_modules/.bin/bower install --allow-root
RUN node_modules/.bin/gulp

FROM maven:latest AS boot
WORKDIR /usr/src/app
COPY pom.xml .
# COPY settings.xml /usr/share/maven/ref/settings-docker.xml
RUN mvn -B -f pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:resolve
COPY . .
RUN mvn -B -s /usr/share/maven/ref/settings-docker.xml clean package -DskipTests
 
FROM java:8-jdk-alpine
WORKDIR /static
COPY --from=ui /usr/src/ui/dist/ .
WORKDIR /app
COPY --from=boot /usr/src/app/target/angularjs-springmvc-sample-boot.jar .
ENTRYPOINT ["java", "-jar", "/app/angularjs-springmvc-sample-boot.jar"]

There are multi FROM in this Dockerfile, the AS is use for naming a stage.
In the final stage, COPY command accepts a --from parameter to refer a former stage.
In our Dockerfile:
  • ui build the frontend codes into dist folder.
  • boot build the Spring Boot based backend codes into a jar.
  • The final stage will run this project.
Follow the Docker Toolbox notes and create a new docker machine for test purpose.
Build docker image.

docker build -t angularjs-springmvc-multistage .
 
Run angularjs-springmvc-multistage in docker container.

docker run -it --rm -p 9000:9000  angularjs-springmvc-multistage
 
Open your browser, and navigate http://docker-machine ip:9000.

multistage docker

评论

此博客中的热门博文

Auditing with Hibernate Envers

Auditing with Hibernate Envers The approaches provided in JPA lifecyle hook and Spring Data auditing only track the creation and last modification info of an Entity, but all the modification history are not tracked. Hibernate Envers fills the blank table. Since Hibernate 3.5, Envers is part of Hibernate core project. Configuration Configure Hibernate Envers in your project is very simple, just need to add   hibernate-envers   as project dependency. <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-envers</artifactId> </dependency> Done. No need extra Event listeners configuration as the early version. Basic Usage Hibernate Envers provides a simple   @Audited   annotation, you can place it on an Entity class or property of an Entity. @Audited private String description; If   @Audited   annotation is placed on a property, this property can be tracked. @Entity @Audited public clas...

Build a Reactive application with Angular 5 and Spring Boot 2.0

I have created a post to describe Reactive programming supports in Spring 5 and its subprojects, all codes of this article are updated the latest Spring 5 RELEASE, check spring-reactive-sample under my Github account. In this post, I will create a simple blog system, including: A user can sign in and sign out. An authenticated user can create a post. An authenticated user can update a post. Only the user who has ADMIN role can delete a post. All users(including anonymous users) can view post list and post details. An authenticated user can add his comments to a certain post. The backend will be built with the latest Spring 5 reactive stack, including: Spring Boot 2.0, at the moment the latest version is 2.0.0.M7 Spring Data MongoDB supports reactive operations for MongoDB Spring Session adds reactive support for WebSession Spring Security 5 aligns with Spring 5 reactive stack The frontend is an Angular based SPA and it will be generated by Angular CLI. The so...

JSF 2.3:Websocket support

Websocket support One of the most attractive features is JSF 2.3 added native websocket support, it means you can write real-time applications with JSF and no need extra effort. To enable websocket support, you have to add javax.faces.ENABLE_WEBSOCKET_ENDPOINT in web.xml . < context-param > < param-name >javax.faces.ENABLE_WEBSOCKET_ENDPOINT</ param-name > < param-value >true</ param-value > </ context-param > Hello Websocket Let's start with a simple example. @ViewScoped @Named ( " helloBean " ) public class HelloBean implements Serializable { private static final Logger LOG = Logger . getLogger( HelloBean . class . getName()); @Inject @Push PushContext helloChannel; String message; public void sendMessage () { LOG . log( Level . INFO , " send push message " ); this . sendPushMessage( " hello " ); } private ...