fabric8 docker-maven-plugin capAdd 失败 "unknown capability to add"
fabric8 docker-maven-plugin capAdd fails with "unknown capability to add"
The Context : 尝试设置一个自动化集成测试套件,maven 可以在其中启动和停止 docker 测试前后的图像 运行 CI 服务器。由于大量文档,决定使用 fabric8。
fabric8io.github.io/docker-maven-plugin/docker-start.html 说
capAdd a list of add elements to specify kernel parameters to add to the container.
我假设语法类似于 ADD local-artifact-version.jar app.jar
但这不起作用。
问题 : 当我 运行 mvn clean package docker:build docker:start -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"
使用 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>
capAdd
不能用于将文件添加到 Docker 图像。它旨在为启动容器设置特定的 Linux 功能。它与 --cap-add
cli option.
相同
要在构建图像时添加文件,您有几种可能性,如文档中所述:
- 您可以使用与 maven-assembly-plugin 非常相似的 assembly。还有一些预定义的描述符,例如包括您的构建工件。
- 您可以参考外部 Docker 文件(您可以在其中放置常规 Docker 文件
ADD
命令。这可以通过在配置(在下一个版本中,您可以将 <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
.
The Context : 尝试设置一个自动化集成测试套件,maven 可以在其中启动和停止 docker 测试前后的图像 运行 CI 服务器。由于大量文档,决定使用 fabric8。
fabric8io.github.io/docker-maven-plugin/docker-start.html 说
capAdd a list of add elements to specify kernel parameters to add to the container.
我假设语法类似于 ADD local-artifact-version.jar app.jar 但这不起作用。
问题 : 当我 运行 mvn clean package docker:build docker:start -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"
使用 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>
capAdd
不能用于将文件添加到 Docker 图像。它旨在为启动容器设置特定的 Linux 功能。它与 --cap-add
cli option.
要在构建图像时添加文件,您有几种可能性,如文档中所述:
- 您可以使用与 maven-assembly-plugin 非常相似的 assembly。还有一些预定义的描述符,例如包括您的构建工件。
- 您可以参考外部 Docker 文件(您可以在其中放置常规 Docker 文件
ADD
命令。这可以通过在配置(在下一个版本中,您可以将<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
.