2016-04-26 87 views
0

上下文:嘗試設置自動集成測試套件,其中maven可以在CI服務器上運行測試前後啓動和停止docker映像。由於廣泛的文檔,決定採用fabric8。fabric8 docker-maven-plugin capAdd失敗並顯示「未知能力添加」

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

capAdd添加元素的列表來指定內核參數添加到容器中。

我假設語法類似於添加本地僞影version.jar app.jar ,但是這是行不通的。

的問題:當我運行MVN清潔套裝碼頭工人:建碼頭工人:啓動-Ddocker.follow =真 我得到一個錯誤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"

什麼正確的使用Dockerfile的的「ADD」語義時使用fabric8 docker maven插件?

聚甲醛

<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> 

回答

1

capAdd不能被用於將文件添加到一個泊塢圖像。它旨在設置啓動容器的特定Linux功能。它與--cap-add cli option相同。

添加文件時建設的圖片,有如文檔中描述的幾種可能性:

  • 您可以使用assembly其工作原理非常類似於Maven的組裝插件。還有預定義的描述符用於例如包括你的建造製品。
  • 你可以參考外部Dockerfile(在那裏你可以把經常Dockerfile ADD命令。這可以通過在配置(設置<build><assembly><dockerFileDir>....在下一版本中被觸發,你可以把<dockerFileDir>也正下方(<build>...</build>)。

因此,對於你的例子(假設你的神器reports-1.0.0-SNAPSHOT-exec.jar),你可以嘗試:

<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> 

descriptor format對細節的文件

如果您不使用分類器exec,事情會更容易,因爲那樣您就可以使用預定義的描述符artifact

+0

謝謝你的詳細解釋。我混淆了capAdd和Add。我應該使用這個組件。再次感謝。 –