2017-04-03 1 views
0

Ich benutze Spotifys Docker-Maven-Plugin zum Erstellen eines Docker-Bild. Genauer gesagt diese:Kleine binäre Datei wird beim Erstellen von Docker Bild mit spotify maven Plugin geändert

<groupId>com.spotify</groupId> 
<artifactId>docker-maven-plugin</artifactId> 
<version>0.4.13</version> 

hat meine Entwicklung Maschine ein Windows 7, so dass ich renne Docker Maschine mit Version docker-machine version 0.9.0, build 15fd4c7 Docker Version diese

ist
Client: 
Version:  1.13.1 
API version: 1.26 
Go version: go1.7.5 
Git commit: 092cba3 
Built:  Wed Feb 8 08:47:51 2017 
OS/Arch:  windows/amd64 

Server: 
Version:  17.03.0-ce 
API version: 1.26 (minimum version 1.12) 
Go version: go1.7.5 
Git commit: 3a232c8 
Built:  Tue Feb 28 07:52:04 2017 
OS/Arch:  linux/amd64 
Experimental: false 

Meine Anwendung verwendet ein Zertifikat, das ich will im Voraus vorbereiten und in das Bild aufnehmen.

Wenn ich das Docker-Image direkt mit Docker CLI erstellen, funktioniert die Keystore-Datei mit dem Zertifikat korrekt.

Wenn ich das Docker-Image mit dem spotify maven-Plugin erstelle, ist die Keystore-Datei beschädigt. Ein Vergleich zeigt, dass es viel größer ist, ein Vergleich seines Inhalts (Hexdump) sieht aus wie es gestreut wurde (ich weiß nicht, wie ich es besser sagen soll) mit zusätzlichen Bytes.

Ich habe ein kleines Beispiel erstellt, die das Verhalten zeigt: Projektstruktur:

-src 
|-main 
| |-docker 
| |-binaries 
| | |-example.jks 
| |-Dockerfile 
|-pom.xml 

erstellen example.jks wie diese

keytool -genkey -keyalg RSA -alias selfsigned -keystore example.jks -storepass password -keypass password -validity 18250 -keysize 2048 -dname "CN=Unknown, OU=Example, O=Example, L=Example, ST=Unknown, C=US" 

pom.xml (keytool von openjdk 8 verwenden)

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 


    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.example</groupId> 
    <artifactId>smallbinary</artifactId> 
    <name>Small binary problem</name> 
    <version>1.0</version> 
    <packaging>jar</packaging> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <build> 
     <resources> 
      <resource> 
       <!-- 
       | Enable resource filtering pre dockerfile build calls. 
       --> 
       <directory>src/main/docker</directory> 
       <targetPath>${project.build.directory}/docker-derived</targetPath> 
       <filtering>true</filtering> 
      </resource> 
     </resources> 
     <pluginManagement> 
      <plugins> 
       <plugin> 
        <groupId>com.spotify</groupId> 
        <artifactId>docker-maven-plugin</artifactId> 
        <version>0.4.13</version> 
        <executions> 
         <execution> 
          <id>build-image</id> 
          <phase>compile</phase> 
          <goals> 
           <goal>build</goal> 
          </goals> 
         </execution> 
        </executions> 
        <configuration> 
         <imageName>${project.artifactId}</imageName> 
         <dockerDirectory>${project.build.directory}/docker-derived</dockerDirectory> 
        </configuration> 
       </plugin> 
      </plugins> 
     </pluginManagement> 
     <plugins> 
      <plugin><!-- Triggers the Docker build configured within the plugin management. --> 
       <groupId>com.spotify</groupId> 
       <artifactId>docker-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

Dockerfile

FROM openjdk:8-jre-alpine 

COPY binaries/* /opt/service/ 

CMD ["keytool", "-list", "-keystore", "/opt/service/example.jks", "-storepass", "password"] 

Ausgang, wenn sie von docker run [imagename]

Keystore type: JKS 
Keystore provider: SUN 

Your keystore contains 1 entry 

selfsigned, Apr 3, 2017, PrivateKeyEntry, 
Certificate fingerprint (SHA1): 07:56:26:66:16:82:DD:BF:6A:61:4B:94:E8:67:69:F8:77:36:5C:6D 

Und leider die Ausgabe direkt per docker build . und laufen gebaut, wenn sie mit Maven gebaut:

keytool error: java.io.IOException: Invalid keystore format 

In anderen Kontexten, wenn größere Binärdateien wie Gläser kopieren, Kriege, Ohren oder Zip-Archive Ich habe keine Schwierigkeiten erlebt. Aber dieses scheint einfach nicht zu funktionieren.

Meine aktuelle Problemumgehung besteht darin, das Zertifikat direkt während der Erstellung des Abbilds über einen RUN-Befehl in der Dockerfile zu erstellen.

Gibt es etwas, was ich vermisse?

P.S. Ich erlebe die gleichen Probleme auf meinem Linux Ubuntu 16.04 LTS Laptop.

Antwort

0

Das Problem wird durch die Ressourcenfilterung verursacht, die in meinem Beispiel (und auch in meinem Produktionscode) aktiviert ist. , die ich von My Technical Life gelernt, was wiederum Links zu einer Stackoverflow Frage jar file gets corrupted while building with maven

Der Code säumige ist dies:

<resource> 
    <!-- 
    | Enable resource filtering pre dockerfile build calls. 
    --> 
    <directory>src/main/docker</directory> 
    <targetPath>${project.build.directory}/docker-derived</targetPath> 
    <-- The next line breaks my binary--> 
    <filtering>true</filtering> 
</resource> 

<filtering>true</filtering> entfernen oder es explizit false Behebungen Code mein Beispiel voran und erstellt eine Arbeits Docker Bild.

Was tun, wenn Sie filtern müssen, wie ich, weil ich auf Projektversionen in meinem Produktionscode Dockerfile verweisen und Maven einige Token ersetzen möchte?

Die Lösung besteht darin, die Projektstruktur ein wenig zu ändern und filterbare und nicht filterbare Ressourcen zu trennen.

änderte ich den Ordnerstruktur wie folgt:

-src 
|-main 
| |-docker 
| |-Dockerfile 
|-resources 
| |-binaries 
| |-example.jks 
|-pom.xml 

und die Ressource Abschnitt meines Beispiel wie folgt geändert:

<resources> 
    <resource> 
    <!-- 
    | Enable resource filtering pre dockerfile build calls for non binaries. 
    --> 
    <directory>src/main/docker</directory> 
    <targetPath>${project.build.directory}/docker-derived</targetPath> 
    <filtering>true</filtering> 
    </resource> 
    <resource> 
    <directory>src/main/resources/binaries</directory> 
    <targetPath>${project.build.directory}/docker-derived/binaries</targetPath> 
    </resource> 
</resources> 

Und dann funktioniert es wie ein Zauber. Entschuldigen Sie, dass Sie an dem Spotify-Plugin zweifeln!

Verwandte Themen