2015-01-04 7 views

Odpowiedz

19

Spróbuj użyć nowych oficjalnych zdjęć, jest jedna dla Maven

https://registry.hub.docker.com/_/maven/

Obraz może zostać wykorzystane do uruchomienia Maven w czasie kompilacji do tworzenia skompilowaną aplikację lub, jak w poniższych przykładach, aby uruchomić budowa Mavena w kontenerze.

Przykład 1 - Maven działa wewnątrz pojemnika

Poniższe polecenie uruchamia swoją Maven budować wewnątrz kontenera:

docker run -it --rm \ 
     -v "$(pwd)":/opt/maven \ 
     -w /opt/maven \ 
     maven:3.2-jdk-7 \ 
     mvn clean install 

Uwagi:

  • Schludny rzeczą tego podejścia jest to, że całe oprogramowanie jest zainstalowane i działa w kontenerze. Potrzebny tylko do dokowania na hoście.
  • Zobacz Dockerfile for this version

Przykład 2 - Używaj Nexusa do plików cache

uruchomić kontenerowych Nexus

docker run -d -p 8081:8081 --name nexus sonatype/nexus 

Tworzenie "settings.xml" file:

<settings> 
    <mirrors> 
    <mirror> 
     <id>nexus</id> 
     <mirrorOf>*</mirrorOf> 
     <url>http://nexus:8081/content/groups/public/</url> 
    </mirror> 
    </mirrors> 
</settings> 

Teraz uruchom Mavena, łącząc się z kontenerem nexus, tak aby zależności będą buforowane

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 

Uwagi:

  • Zaletą Nexus działa w tle to, że inne repozytoria 3rd party mogą być zarządzane poprzez opiekunie URL transparentnie do Maven kompilacje działa w lokalnych pojemników.
+0

może to być użyte, aby zastąpić maven central dla kompilacji gradle? jak podano w https://support.sonatype.com/entries/21596297-How-do-I-configure-my-Gradle-build-to-download-artifacts-from-Nexus- zastąpiłem 'mavenCentral()' w moim Zależności gradowe z 'maven {url" http: // nexus: 8081 ... "' i teraz właśnie problemy z rozdzielczością. – mohamnag

+0

@mohamnag Prawidłowo, powyższy plik ustawień Maven robi dokładnie to, przekierowując wszystkie żądania Maven Central do lokalnego repozytorium nexus. Musisz opisać, jakie masz problemy z rozdzielczością. Może być cokolwiek ... Na przykład, czy skonfigurowałeś link Docker, aby host "nexus" został poprawnie rozwiązany? –

+0

Okazało się, że wszystko jest w porządku, ale nexus potrzebował czasu na zbudowanie indeksu lub coś innego spowodowało problem. Próbowałem również uruchomić aktualizację indeksu, dlatego nie jestem pewien, w którym przypadku rozwiązano problem. Dzięki jednak. – mohamnag

7

Jako zasada, należy zbudować tłuszczu JAR użyciu Maven (JAR, który zawiera zarówno kod i wszystkie zależności).

Następnie można napisać plik Dockerfile, który pasuje do twoich wymagań (jeśli możesz zbudować gruby JAR, potrzebujesz tylko bazowego os, takiego jak CentOS i JVM).

To jest to, czego używam do aplikacji Scala (która jest oparta na języku Java).

FROM centos:centos7 

# Prerequisites. 

RUN yum -y update 
RUN yum -y install wget tar 

# Oracle Java 7 

WORKDIR /opt 

RUN wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u71-b14/server-jre-7u71-linux-x64.tar.gz 
RUN tar xzf server-jre-7u71-linux-x64.tar.gz 
RUN rm -rf server-jre-7u71-linux-x64.tar.gz 
RUN alternatives --install /usr/bin/java java /opt/jdk1.7.0_71/bin/java 1 

# App 

USER daemon 

# This copies to local fat jar inside the image 
ADD /local/path/to/packaged/app/appname.jar /app/appname.jar 

# What to run when the container starts 
ENTRYPOINT [ "java", "-jar", "/app/appname.jar" ] 

# Ports used by the app 
EXPOSE 5000 

Spowoduje to utworzenie obrazu opartego na systemie CentOS przy użyciu środowiska Java7. Po uruchomieniu wykona słoik aplikacji.

Najlepszym sposobem na wdrożenie go za pośrednictwem rejestru Docker jest to jak Github dla obrazów Docker.

Można budować wizerunek takiego:

# current dir must contain the Dockerfile 
docker build -t username/projectname:tagname . 

Następnie można popchnąć obraz w ten sposób:

docker push username/projectname # this pushes all tags 

Gdy obraz jest na Docker rejestru, można wyciągnąć go z w dowolnym miejscu na świecie i uruchomić go.

Aby uzyskać więcej informacji, zobacz Docker User Guide.

Coś pamiętać:

Można też wyciągnąć repozytorium wewnątrz obrazu i budować słoik jako część wykonania pojemnika, ale nie jest to dobre podejście, ponieważ kod może zmienić, a ci może skończyć się używanie innej wersji aplikacji bez powiadomienia.

Zbudowanie pojemnika na tłuszcz usuwa ten problem.

+5

Dlaczego upadek? –

+0

HI, użyłem twojego przykładu w moim pliku dokowania, aby skopiować słoik tłuszczu na obrazie, ale kompilacja kończy się niepowodzeniem, ponieważ nie można znaleźć tłustego słoja podanego lokalnie. Czy jest to coś w stylu target/app.jar? –

+0

Witam, czy istnieje sposób na pobranie artefaktu z nexusa w czasie wykonywania? Aby określić artefakt do pobrania przy użyciu właściwości, a nie rzeczywiste łącze do samego słoika? W pliku dokowanym: 'RUN wget -O {project.build.finalname} .jar' Ale chcę pobrać powyższy słoik z nexusa. –

27

Może istnieć wiele sposobów .. Ale ja realizowany przez następujące dwa sposoby

podanym przykładzie jest od projektu maven.

1. Korzystanie Dockerfile w projekcie maven

Zastosowanie następującą strukturę plików:

Demo 
└── src 
| ├── main 
| │ ├── java 
| │  └── org 
| │   └── demo 
| │    └── Application.java 
| │ 
| └── test 
| 
├──── Dockerfile 
├──── pom.xml 

i zaktualizować Dockerfile jak:

FROM java:8 
EXPOSE 8080 
ADD /target/demo.jar demo.jar 
ENTRYPOINT ["java","-jar","demo.jar"] 

przejdź do folderu projektu i rodzaju po wykonaniu polecenia wykonasz ab le, aby utworzyć obraz i uruchomić to zdjęcie:

$ mvn clean 
$ mvn install 
$ docker build -f Dockerfile -t springdemo . 
$ docker run -p 8080:8080 -t springdemo 

Get wideo na Spring Boot with Docker

2.Korzystanie z wtyczek Maven

Dodaj dany plugin maven w pom.xml

<plugin> 
    <groupId>com.spotify</groupId> 
    <artifactId>docker-maven-plugin</artifactId> 
    <version>0.4.5</version> 
     <configuration> 
      <imageName>springdocker</imageName> 
      <baseImage>java</baseImage> 
      <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> 
      <resources> 
       <resource> 
        <targetPath>/</targetPath> 
        <directory>${project.build.directory}</directory> 
        <include>${project.build.finalName}.jar</include> 
       </resource> 
      </resources> 
     </configuration> 
    </plugin> 

przejdź do folderu projektu i wpisz następujące polecenia będzie można stworzyć obraz i uruchomić ten obraz:

$ mvn clean package docker:build 
$ docker images 
$ docker run -p 8080:8080 -t <image name> 

W pierwszy przykład tworzymy Dockerfile i dostarczamy obraz podstawowy i dodając słoik, więc po wykonaniu tego uruchomimy polecenie docker, aby zbudować obraz o określonej nazwie, a następnie uruchomimy ten obraz ..

Podczas gdy w drugim przykładzie używamy wtyczki maven, w której udostępniamy baseImage i imageName, więc nie musimy tworzyć tutaj pliku Docker. Po pakowaniu projektu mającego uzyskać obraz dokowania i wystarczy uruchomić ten obraz ..

+0

Zamiast modyfikować punkt wejścia, aby określić nazwę artefaktu, można użyć podejścia podobnego do tego tutaj: https://www.alooma.com/blog/building-dockers - użyj wtyczki opartej na zależnościach od mavenów, aby użyć wspólnej nazwy. Nie trzeba umieszczać wersjonowanego słoika w kontenerze dokowanym, ponieważ sam kontener jest wersjonowany. – kboom

Powiązane problemy