2016-04-26 11 views
0

Der Kontext: versuchen, eine automatisierte Integration Test-Suite einzurichten, wo Maven Docker Images vor und nach Tests auf einem CI-Server starten und stoppen kann. Aufgrund der umfangreichen Dokumentation entschied man sich für fabric8.fabric8 docker-maven-plugin capAdd schlägt fehl mit "unbekannte Fähigkeit hinzuzufügen"

fabric8io.github.io/docker-maven-plugin/docker-start.html sagt

Liste hinzufügen Elemente capAdd Kernel-Parameter angeben, zu dem Behälter hinzuzufügen.

Ich nehme an, die Syntax local-Artefakt-version.jar zu ADD app.jar ähnlich ist, aber das funktioniert nicht.

Das Problem: wenn ich mvn sauber Paket Docker laufen: Docker bauen: start -Ddocker.follow = true I io.fabric8.maven.docker.access.hc.http.HttpRequestException: Cannot start container [sha1]: Unknown capability to add "target/artifact-1.0.0-SNAPSHOT-exec.jar app.jar"

Was die korrekte Verwendung von Dockerfile ist ein Fehler "ADD" semantische wenn mit dem fabric8 docker maven plugin?

Die pom:

<plugins> 
    <plugin> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-maven-plugin</artifactId> 
    </plugin> 
    <plugin> 
     <groupId>io.fabric8</groupId> 
     <artifactId>docker-maven-plugin</artifactId> 
     <configuration> 

<image> 
         <name>postgres:9.4</name> 
         <alias>dbstore</alias> 
         <run> 
          <namingStrategy>alias</namingStrategy> 
          <volumes> 
           <bind>/var/lib/postgresql/data</bind> 
          </volumes> 
         </run> 
        </image> 
        <image> 
         <name>private-dockerhub.company.com/dbpath/postgres:latest</name> 
         <alias>data_dump_loader</alias> 
         <run> 
          <namingStrategy>alias</namingStrategy> 
          <ports> 
           <port>5432:5432</port> 
          </ports> 

          <volumes> 
           <from>dbstore</from> 
          </volumes> 
         </run> 
        </image> 

        <image> 
         <name>private-dockerhub.commpany.com/path/reports</name> 
         <alias>reports</alias> 
         <build> 
          <from>private-dockerhub.company.com/core/java:oracle-server-jre8</from> 
          <tags> 
           <tag>${project.version}</tag> 
          </tags> 
          <entryPoint> 
           <arg>java</arg> 
           <arg>-Djava.security.egd=file:/dev/./urandom</arg> 
           <arg>-jar</arg> 
           <arg>/app.jar</arg> 
          </entryPoint> 
         </build> 
         <run> 
          <namingStrategy>alias</namingStrategy> 
          <capAdd> 
           <capAdd>target/reports-1.0.0-SNAPSHOT-exec.jar app.jar</capAdd> 
          </capAdd> 
          <ports> 
           <port>${project.port}:${project.port}</port> 
          </ports> 
          <wait> 
           <!-- The plugin waits until this URL is reachable via HTTP ... --> 
           <http> 
            <url>http://localdocker:${project.port}/beans</url> 
            <method>GET</method> 
            <status>403</status> 
           </http> 
           <!-- ... but at max 10 seconds --> 
           <time>120000</time> 
          </wait> 
          <log> 
           <enabled>true</enabled> 
           <color>red</color> 
          </log> 
          <env> 
                <SPRING_DATASOURCE_URL>jdbc:postgresql://localdocker:5432/thedatabase</SPRING_DATASOURCE_URL> 
           <SPRING_DATASOURCE_DRIVER-CLASS-NAME>org.postgresql.Driver</SPRING_DATASOURCE_DRIVER-CLASS-NAME> 
           <SPRING_DATASOURCE_USERNAME>cool-username</SPRING_DATASOURCE_USERNAME> 
           <SPRING_DATASOURCE_PASSWORD>secret</SPRING_DATASOURCE_PASSWORD> 

          </env> 
          <extraHosts>localdocker:ip.168.99.100</extraHosts> 
         </run> 
        </image> 

     </configuration> 
    </plugin> 
    </plugins> 

Antwort

1

capAdd nicht für das Hinzufügen von Dateien zu einem Docker Bild verwendet werden kann. Es soll bestimmte Linux-Fähigkeiten zum Starten von Containern festlegen. Es ist das gleiche wie die --cap-add cli option.

Zum Hinzufügen von Dateien, wenn Bilder bauen, haben Sie mehrere Möglichkeiten, wie in der Dokumentation beschrieben:

  • Sie können eine assembly verwenden, die ähnlich wie die Maven-Montage-Plugin funktioniert. Es gibt auch vordefinierte Deskriptoren für z.B. einschließlich Ihres Buildartefakts.
  • Sie auf einen externen Dockerfile beziehen (wo Sie regelmäßig Dockerfile ADD Befehle setzen können. Dies kann durch Setzen eines <build><assembly><dockerFileDir>.... in der Konfiguration ausgelöst werden (in der nächsten Version der <dockerFileDir> direkt unterhalb auch (<build>...</build> setzen können.)

So für Ihr Beispiel (unter der Annahme, dass Ihr Artefakt reports-1.0.0-SNAPSHOT-exec.jar ist) Sie könnten versuchen.

<build> 
    <from>private-dockerhub.company.com/core/java:oracle-server-jre8</from> 
    <tags> 
     <tag>${project.version}</tag> 
    </tags> 
    <entryPoint> 
     <arg>java</arg> 
     <arg>-Djava.security.egd=file:/dev/./urandom</arg> 
     <arg>-jar</arg> 
     <arg>/app.jar</arg> 
    </entryPoint> 
    <!-- ============================================ --> 
    <assembly> 
     <inline> 
     <dependencySets> 
      <dependencySet> 
       <includes> 
       <include>${project.groupId}:${project.artifactId}:jar:${project.version}:exec</include> 
       </includes> 
       <outputFileNameMapping>app.jar</outputFileNameMapping> 
      </dependencySet> 
     </dependencySets> 
     </inline> 
    </assembly> 
</build> 

finden Sie in der Dokumentation der Details descriptor format

Wenn Sie keinen Klassifizierer exec verwenden würden, wären die Dinge viel einfacher, denn dann könnten Sie den vordefinierten Deskriptor artifact verwenden.

+0

Vielen Dank für die gründliche Erklärung. Ich habe capAdd und Add verwirrt. Ich hätte dafür eine Versammlung brauchen sollen. Danke noch einmal. –