Contoh kerja.
Ini bukan tutorial boot musim semi. Ini adalah jawaban yang diperbarui untuk pertanyaan tentang cara menjalankan build Maven dalam container Docker.
Pertanyaan awalnya diposting 4 tahun yang lalu.
1. Buat aplikasi
Gunakan penginisialisasi pegas untuk membuat aplikasi demo
https://start.spring.io/
Ekstrak arsip zip secara lokal
2. Buat 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"]
Catatan
- Contoh ini menggunakan build multi-tahap . Tahap pertama digunakan untuk membangun kode. Tahap kedua hanya berisi jar yang dibangun dan JRE untuk menjalankannya (perhatikan bagaimana jar disalin antar tahapan).
3. Bangun citra
docker build -t demo .
4. Jalankan image
$ 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
Baca dokumentasi hub Docker tentang bagaimana build Maven dapat dioptimalkan untuk menggunakan repositori lokal ke cache jars.
Perbarui (2019-02-07)
Pertanyaan ini sekarang sudah berusia 4 tahun dan pada saat itu bisa dikatakan membangun aplikasi menggunakan Docker telah mengalami perubahan yang signifikan.
Opsi 1: Pembuatan multi-tahap
Gaya baru ini memungkinkan Anda membuat gambar yang lebih ringan yang tidak merangkum alat pembuatan dan kode sumber Anda.
Contoh di sini lagi-lagi menggunakan gambar dasar maven resmi untuk menjalankan tahap pertama pembuatan menggunakan versi Maven yang diinginkan. Bagian kedua dari file menentukan bagaimana toples yang dibangun dirakit menjadi gambar keluaran akhir.
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"]
catatan:
- Saya menggunakan gambar dasar distroless Google , yang berusaha menyediakan waktu yang cukup untuk aplikasi java.
Opsi 2: Jib
Saya belum pernah menggunakan pendekatan ini tetapi tampaknya layak untuk diselidiki karena memungkinkan Anda membuat gambar tanpa harus membuat hal-hal buruk seperti Dockerfiles :-)
https://github.com/GoogleContainerTools/jib
Proyek ini memiliki plugin Maven yang mengintegrasikan pengemasan kode Anda langsung ke alur kerja Maven Anda.
Jawaban asli (Termasuk untuk kelengkapan, tetapi ditulis berabad-abad yang lalu)
Coba gunakan gambar resmi baru, ada satu untuk Maven
https://registry.hub.docker.com/_/maven/
Image dapat digunakan untuk menjalankan Maven pada waktu build untuk membuat aplikasi yang dikompilasi atau, seperti pada contoh berikut, untuk menjalankan build Maven dalam container.
Contoh 1 - Maven berjalan di dalam wadah
Perintah berikut menjalankan build Maven Anda di dalam container:
docker run -it --rm \
-v "$(pwd)":/opt/maven \
-w /opt/maven \
maven:3.2-jdk-7 \
mvn clean install
Catatan:
- Hal yang rapi tentang pendekatan ini adalah bahwa semua perangkat lunak diinstal dan dijalankan di dalam wadah. Hanya perlu buruh pelabuhan di mesin host.
- Lihat Dockerfile untuk versi ini
Contoh 2 - Gunakan Nexus untuk menyimpan file dalam cache
Jalankan wadah Nexus
docker run -d -p 8081:8081 --name nexus sonatype/nexus
Buat file "settings.xml":
<settings>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://nexus:8081/content/groups/public/</url>
</mirror>
</mirrors>
</settings>
Sekarang jalankan Maven yang menautkan ke penampung nexus, sehingga dependensi akan di-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
Catatan:
- Keuntungan menjalankan Nexus di latar belakang adalah repositori pihak ketiga lainnya dapat dikelola melalui URL admin secara transparan ke build Maven yang berjalan di penampung lokal.
mavenCentral()
dependensi gradle saya denganmaven {url "http://nexus:8081..."
dan sekarang baru saja mendapatkan masalah resolusi.