【问题标题】:fabric8 docker-maven-plugin capAdd fails with "unknown capability to add"fabric8 docker-maven-plugin capAdd 因“未知添加能力”而失败
【发布时间】:2016-08-20 12:58:39
【问题描述】:

上下文:尝试设置一个自动化集成测试套件,其中 maven 可以在 CI 服务器上运行测试之前和之后启动和停止 docker 映像。由于大量的文档,决定使用 fabric8。

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

cap添加一个添加元素列表以指定要添加到容器的内核参数。

我假设语法类似于 ADD local-artifact-version.jar app.jar 但这不起作用。

问题:当我运行 mvn clean package docker:build docker:start -Ddocker.follow=true 我收到一个错误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"

在使用 fabric8 docker maven 插件时,Dockerfile 的“ADD”语义的正确用法是什么?

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>

【问题讨论】:

    标签: maven docker fabric8


    【解决方案1】:

    capAdd 不能用于向 Docker 映像添加文件。它旨在为启动容器设置特定的 Linux 功能。与--cap-add cli option相同。

    要在构建图像时添加文件,您有多种可能性,如文档中所述:

    • 您可以使用assembly,其工作方式与 maven-assembly-plugin 非常相似。还有预定义的描述符,例如包括您的构建工件。
    • 你可以参考一个外部的Dockerfile(你可以在其中放置常规的DockerfileADD命令。这可以通过在配置中设置&lt;build&gt;&lt;assembly&gt;&lt;dockerFileDir&gt;....来触发(在下一个版本中你可以直接在下面放置&lt;dockerFileDir&gt;) (&lt;build&gt;...&lt;/build&gt;)。

    因此,对于您的示例(假设您的工件是 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

    【讨论】:

    • 感谢您的详尽解释。我混淆了 capAdd 和 Add。我应该为此使用一个程序集。再次感谢。
    猜你喜欢
    • 2020-01-15
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 2019-04-05
    相关资源
    最近更新 更多