Gradle bootBuildImage 在 GitLab CI/CD 中使用 docker:dind service 的 'No digest found'



我想使用bootBuildImage任务构建Spring Boot 2.4服务的docker映像,并将其推送到GitLab注册表

我有以下.gitlab-ci.yml文件:

stages:
- build
- deploy
build:
stage: build
rules:
- if: $CI_MERGE_REQUEST_ID
image: azul/zulu-openjdk:15.0.2
script:
- export GRADLE_OPTS="-Dorg.gradle.daemon=false -Dorg.gradle.internal.launcher.welcomeMessageEnabled=false"
- ./gradlew clean build
docker-build:
variables:
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: "/certs"
stage: build
image: azul/zulu-openjdk:15.0.2
services:
- docker:dind
script:
- apt-get update
- apt-get install -y apt-transport-https ca-certificates curl software-properties-common
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add
- add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- apt-get update -y
- apt-get install -y docker-ce
- service docker start
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
- ./gradlew bootBuildImage --imageName="$CI_REGISTRY_IMAGE"
- docker push "$CI_REGISTRY_IMAGE"
only:
- develop

但是我得到了以下错误,这对进一步挖掘没有足够的帮助:

$ service docker start
* Starting Docker: docker
...done.
$ docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
$ ./gradlew bootBuildImage --imageName="$CI_REGISTRY_IMAGE"
Downloading https://services.gradle.org/distributions/gradle-6.7.1-bin.zip
.........10%..........20%..........30%..........40%..........50%.........60%..........70%..........80%..........90%..........100%
Welcome to Gradle 6.7.1!
Here are the highlights of this release:
- File system watching is ready for production use
- Declare the version of Java your build requires
- Java 15 support
For more details see https://docs.gradle.org/6.7.1/release-notes.html
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :compileJava
> Task :processResources
> Task :classes
> Task :bootJarMainClassName
> Task :bootJar
> Task :bootBuildImage
Building image 'registry.gitlab.com/company/project/web-api:latest'
> Pulling builder image 'docker.io/paketobuildpacks/builder:base' ..................................................
> Task :bootBuildImage FAILED
5 actionable tasks: 5 executed
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':bootBuildImage'.
> No digest found
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 4m 32s

如果有更好的方法来实现这与GitLab CI/CD,请告诉我:)

感谢任何帮助!

感谢

在仔细阅读了GitLab CI文档后,我发现我必须添加这些变量:

DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_VERIFY: 1
DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"

完整工作的.gitlab-ci.yml文件:

stages:
- build
- deploy
build:
stage: build
rules:
- if: $CI_MERGE_REQUEST_ID
image: azul/zulu-openjdk:15.0.2
script:
- export GRADLE_OPTS="-Dorg.gradle.daemon=false -Dorg.gradle.internal.launcher.welcomeMessageEnabled=false"
- ./gradlew clean build
docker-build:
variables:
DOCKER_HOST: tcp://docker:2376
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: "/certs"
DOCKER_TLS_VERIFY: 1
DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"
stage: build
image: azul/zulu-openjdk:15.0.2
services:
- docker:dind
script:
- apt-get update
- apt-get install -y apt-transport-https ca-certificates curl software-properties-common
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add
- add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- apt-get update -y
- apt-get install -y docker-ce
- service docker start
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
- ./gradlew bootBuildImage --imageName="$CI_REGISTRY_IMAGE"
- docker push "$CI_REGISTRY_IMAGE"
only:
- develop

最新更新