spring - 在运行 mvn spring-boot:build-image 时使用 Artifactory
问题描述
我希望能够运行 spring-boot:build-image 并让它从我们的本地 Artifactory 服务器而不是 docker.io 中提取 paketobuildpack。我希望插件使用 docker 配置文件作为我的凭据,而不是在 pom 文件中硬编码它们。
这有效:
<docker>
<builderRegistry>
<username>username</username>
<password>password</password>
<url>https://artifactory.mycompany.com/v2/</url>
</builderRegistry>
</docker>
当我运行时mvn spring-boot:build-image
,没有上面的 docker 块,我收到以下错误:
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.4.2:build-image (default-cli) on project demo: Execution default-cli of goal org.springframework.boot:spring-boot-maven-plugin:2.4.2:build-image failed: Docker API call to 'localhost/v1.24/images/create?fromImage=artifactory.mycompany.com%2Fcommon-docker-virtual%2Fpaketobuildpacks%2Fbuilder%3Abase'
failed with status code 500 "Internal Server Error" and message "Head https://artifactory.mycompany.com/v2/common-docker-virtual/paketobuildpacks/builder/manifests/base:
unknown: Authentication is required" -> [Help 1]
我的 .docker/config.json 具有以下配置:
{
"auths": {
"artifactory.mycompany.com": {
"auth": "**token**",
"email": "myemail@mycompany.com"
}
},
"credStore": "desktop",
"credsStore": "desktop"
}
我可以成功运行 docker build,它成功地将我们的 Artifactory 用于其他不相关的图像。
我的 pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.penske.architecture</groupId>
<artifactId>myapp</artifactId>
<version>1.0.0.RELEASE</version>
<name>myapp</name>
<properties>
<maven.compiler.target>14</maven.compiler.target>
<maven.compiler.source>14</maven.compiler.source>
<java.version>14</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
<image>
<name>artifactory.mycompany.com/common-docker-virtual/library/${project.artifactId}</name>
<builder>artifactory.mycompany.com/common-docker-virtual/paketobuildpacks/builder:base</builder>
<env>
<BP_JVM_VERSION>14</BP_JVM_VERSION>
</env>
</image>
</configuration>
<executions>
<execution>
<goals>
<goal>build-image</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
完整的 Maven 输出
[INFO] Scanning for projects...
[INFO]
[INFO] ----------< my.group:myapp >-----------
[INFO] Building myapp 1.0.0.RELEASE
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] >>> spring-boot-maven-plugin:2.4.2:build-image (default-cli) > package @ myapp >>>
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ myapp ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] Copying 3 resources
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ myapp ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ myapp ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] skip non existing resourceDirectory C:\myapp\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ myapp ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ myapp ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ myapp ---
[INFO] Building jar: C:\myapp\target\ldap-changelog-exporter.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.4.2:repackage (repackage) @ myapp ---
[INFO] Replacing main artifact with repackaged archive
[INFO]
[INFO] <<< spring-boot-maven-plugin:2.4.2:build-image (default-cli) < package @ myapp <<<
[INFO]
[INFO]
[INFO] --- spring-boot-maven-plugin:2.4.2:build-image (default-cli) @ myapp ---
[INFO] Building image 'artifactory.mycompany.com/common-docker-virtual/library/myapp:latest'
[INFO]
[INFO] > Pulling builder image 'artifactory.mycompany.com/common-docker-virtual/paketobuildpacks/builder:base' 100%
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.024 s
[INFO] Finished at: 2021-02-11T16:48:27-05:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.4.2:build-image (default-cli) on project myapp: Execution default-cli of goal org.springframework.boot:spring-boot-maven-plugin:2.4.2:build-image failed: Docker API call to 'localhost/v1.24/images/create?fromImage=artifactory.mycompany.com%2Fcommon-docker-virtual%2Fpaketobuildpacks%2Fbuilder%3Abase' failed with status code 500 "Internal Server Error" and message "Head https://artifactory.mycompany.com/v2/common-docker-virtual/paketobuildpacks/builder/manifests/base: unknown: Authentication is required" -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException
Process finished with exit code 1
解决方案
将凭据放入属性部分( https://maven.apache.org/settings.html#Profiles )内的 settings.xml (~/.m2/settings.xml 或您在 mvn 命令中指定的任何内容),然后放入您的pom.xml 用定义的变量名替换硬编码值。
如果您使用环境变量 (${env.something}),您甚至可以跳过 settings.xml 并从 cli 中定义它们。
推荐阅读
- jquery - ASP.NET 的 AJAX 发布问题
- bash - openBinaryFile:在 Gitlab CI bash 脚本中执行 pandoc 时不存在
- prometheus - 对特定主机禁用警报,同时对所有其他主机发出警报
- python - 如何格式化“datetime.timedelta”类型
- azure - 在 Azure ApplicationInsights 中创建 API 密钥所需的角色/权限
- android-studio - 生成签名的 APK 在 Android Studio 3.4 中出现错误
- javascript - 覆盖 document.body.scrollTop 调用
- angular - 来自复选框角度材质的数组
- python - 使用具有特定键盘布局的 Evdev 将键码解析为扫描码
- sql - SQL Server 批量插入不会导入文本文件,但 DTS 会