Esempio di lavoro.
Questo non è un tutorial per l'avvio primaverile. È la risposta aggiornata a una domanda su come eseguire una build Maven all'interno di un container Docker.
Domanda originariamente pubblicata 4 anni fa.
1. Genera un'applicazione
Usa l'inizializzatore di primavera per generare un'app demo
https://start.spring.io/
Estrai l'archivio zip localmente
2. Creare un Dockerfile
#
# Build stage
#
FROM maven:3.6.0-jdk-11-slim AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package
#
# Package stage
#
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/demo-0.0.1-SNAPSHOT.jar /usr/local/lib/demo.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/local/lib/demo.jar"]
Nota
- Questo esempio utilizza una build in più fasi . La prima fase viene utilizzata per creare il codice. Il secondo stadio contiene solo il jar costruito e un JRE per eseguirlo (nota come il jar viene copiato tra gli stadi).
3. Costruisci l'immagine
docker build -t demo .
4. Eseguire l'immagine
$ docker run --rm -it demo:latest
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.3.RELEASE)
2019-02-22 17:18:57.835 INFO 1 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication v0.0.1-SNAPSHOT on f4e67677c9a9 with PID 1 (/usr/local/bin/demo.jar started by root in /)
2019-02-22 17:18:57.837 INFO 1 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to default profiles: default
2019-02-22 17:18:58.294 INFO 1 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 0.711 seconds (JVM running for 1.035)
Misc
Leggi la documentazione dell'hub Docker su come la build Maven può essere ottimizzata per utilizzare un repository locale per memorizzare nella cache i jar.
Aggiornamento (2019-02-07)
Questa domanda risale a 4 anni fa e in questo lasso di tempo è giusto dire che la creazione di applicazioni utilizzando Docker ha subito cambiamenti significativi.
Opzione 1: build in più fasi
Questo nuovo stile ti consente di creare immagini più leggere che non incapsulano gli strumenti di compilazione e il codice sorgente.
L'esempio qui utilizza di nuovo l' immagine di base ufficiale di Maven per eseguire la prima fase della build utilizzando una versione desiderata di Maven. La seconda parte del file definisce come il jar costruito viene assemblato nell'immagine di output finale.
FROM maven:3.5-jdk-8 AS build
COPY src /usr/src/app/src
COPY pom.xml /usr/src/app
RUN mvn -f /usr/src/app/pom.xml clean package
FROM gcr.io/distroless/java
COPY --from=build /usr/src/app/target/helloworld-1.0.0-SNAPSHOT.jar /usr/app/helloworld-1.0.0-SNAPSHOT.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/app/helloworld-1.0.0-SNAPSHOT.jar"]
Nota:
- Sto usando l' immagine di base senza difficoltà di Google , che si sforza di fornire un tempo di esecuzione sufficiente per un'app java.
Opzione 2: Jib
Non ho usato questo approccio ma sembra degno di indagine in quanto ti consente di creare immagini senza dover creare cose brutte come Dockerfiles :-)
https://github.com/GoogleContainerTools/jib
Il progetto ha un plug-in Maven che integra la confezione del codice direttamente nel flusso di lavoro Maven.
Risposta originale (inclusa per completezza, ma scritta secoli fa)
Prova a usare le nuove immagini ufficiali, ce n'è una per Maven
https://registry.hub.docker.com/_/maven/
L'immagine può essere utilizzata per eseguire Maven in fase di compilazione per creare un'applicazione compilata o, come negli esempi seguenti, per eseguire una build Maven all'interno di un contenitore.
Esempio 1 - Maven in esecuzione all'interno di un container
Il seguente comando esegue la build di Maven all'interno di un contenitore:
docker run -it --rm \
-v "$(pwd)":/opt/maven \
-w /opt/maven \
maven:3.2-jdk-7 \
mvn clean install
Appunti:
- La cosa bella di questo approccio è che tutto il software è installato e in esecuzione all'interno del contenitore. Richiede solo docker sulla macchina host.
- Vedi Dockerfile per questa versione
Esempio 2: utilizza Nexus per memorizzare i file nella cache
Esegui il contenitore Nexus
docker run -d -p 8081:8081 --name nexus sonatype/nexus
Crea un file "settings.xml":
<settings>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://nexus:8081/content/groups/public/</url>
</mirror>
</mirrors>
</settings>
Ora esegui Maven che collega al contenitore nexus, in modo che le dipendenze vengano memorizzate nella cache
docker run -it --rm \
-v "$(pwd)":/opt/maven \
-w /opt/maven \
--link nexus:nexus \
maven:3.2-jdk-7 \
mvn -s settings.xml clean install
Appunti:
- Un vantaggio dell'esecuzione di Nexus in background è che altri repository di terze parti possono essere gestiti tramite l'URL di amministrazione in modo trasparente per le build Maven in esecuzione in contenitori locali.
mavenCentral()
nelle mie dipendenze gradle conmaven {url "http://nexus:8081..."
e ora sto solo riscontrando problemi di risoluzione.