在容器中安装 Docker 以供 GitLab CI 构建使用
Install Docker in container for use by GitLab CI build
我是 Docker 的新手,但有一个 Java 网络应用程序项目,我的 Maven 构建为其生成并安装了一个 Docker 图像。即
mvn clean install
产生:
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.gitlab.com/me/myapp 0.0.1-SNAPSHOT-dev 12d69e5ab28b 45 minutes ago 666 MB
我正在使用 Spotify 的 Maven 插件来构建它,然后我可以使用以下方法将其部署到存储库:
mvn docker:push
效果很好。 但是: 我正在为 CI 使用 GitLab,我的 .gitlab-ci.yml
文件包含:
image: maven:3.3.9-jdk-8
build:
script: "mvn clean install && mvn docker:push"
这几乎可以工作,但失败了,因为 Docker 没有安装 在我的容器 中,它是 运行 构建:
[INFO] Building image registry.gitlab.com/me/myapp
Dec 31, 2016 8:30:45 PM org.apache.http.impl.execchain.RetryExec execute
INFO: I/O exception (java.io.IOException) caught when processing request to {}->unix://localhost:80: No such file or directory
Dec 31, 2016 8:30:45 PM org.apache.http.impl.execchain.RetryExec execute
INFO: Retrying request to {}->unix://localhost:80
Dec 31, 2016 8:30:45 PM org.apache.http.impl.execchain.RetryExec execute
INFO: I/O exception (java.io.IOException) caught when processing request to {}->unix://localhost:80: No such file or directory
... (more of the same) ...
这里的解决方案似乎是将 Docker 安装到容器中。我找不到具有 Java、Maven 和 Docker 的预构建映像,但我确实尝试将 Docker 配置为服务:
services:
- docker:1.13-rc
但结果是一样的 - 似乎服务旨在用作可以连接到的外部服务,但不会立即安装在同一个容器中。
我应该如何着手 更新我的 .yml
文件,以便 GitLab 构建可以构建和推送 Docker 图像?
我觉得你很亲近。
Gitlab 在 阶段 中工作,并且您已经为您的 java 应用程序正确定义了适当的 build
阶段。但是,您需要另一个阶段来构建您的 docker 图像。我不太熟悉 Maven 以及为 mvn docker:push
步骤配置的内容,但我假设它是 docker build
和 docker push
命令的一个非常简单的包装器。
我建议将事情分成不同的阶段,并使用工件在容器之间传输构建的文件。
我认为您的 .gitlab-ci.yml
文件应该如下所示:
image: maven:3.3.9-jdk-8
stages:
- build_application
- build_image
# This stage builds your application
build_application:
stage: build_application
script:
- mvn clean install
artifacts:
paths:
- my-application.jar
build_image:
image: docker:latest
services:
- docker:dind
stage: build_image
# Remember that even though the JAR file was built in a separate image
# Gitlab CI will make it available in this image because I specified it in artifacts
#
# All I really need to build the Docker image is the artifact(s) & Dockerfile
script:
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
- docker build --no-cache=true -t registry.gitlab.com/me/myapp .
- docker push registry.gitlab.com/me/myapp
我是 Docker 的新手,但有一个 Java 网络应用程序项目,我的 Maven 构建为其生成并安装了一个 Docker 图像。即
mvn clean install
产生:
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.gitlab.com/me/myapp 0.0.1-SNAPSHOT-dev 12d69e5ab28b 45 minutes ago 666 MB
我正在使用 Spotify 的 Maven 插件来构建它,然后我可以使用以下方法将其部署到存储库:
mvn docker:push
效果很好。 但是: 我正在为 CI 使用 GitLab,我的 .gitlab-ci.yml
文件包含:
image: maven:3.3.9-jdk-8
build:
script: "mvn clean install && mvn docker:push"
这几乎可以工作,但失败了,因为 Docker 没有安装 在我的容器 中,它是 运行 构建:
[INFO] Building image registry.gitlab.com/me/myapp
Dec 31, 2016 8:30:45 PM org.apache.http.impl.execchain.RetryExec execute
INFO: I/O exception (java.io.IOException) caught when processing request to {}->unix://localhost:80: No such file or directory
Dec 31, 2016 8:30:45 PM org.apache.http.impl.execchain.RetryExec execute
INFO: Retrying request to {}->unix://localhost:80
Dec 31, 2016 8:30:45 PM org.apache.http.impl.execchain.RetryExec execute
INFO: I/O exception (java.io.IOException) caught when processing request to {}->unix://localhost:80: No such file or directory
... (more of the same) ...
这里的解决方案似乎是将 Docker 安装到容器中。我找不到具有 Java、Maven 和 Docker 的预构建映像,但我确实尝试将 Docker 配置为服务:
services:
- docker:1.13-rc
但结果是一样的 - 似乎服务旨在用作可以连接到的外部服务,但不会立即安装在同一个容器中。
我应该如何着手 更新我的 .yml
文件,以便 GitLab 构建可以构建和推送 Docker 图像?
我觉得你很亲近。
Gitlab 在 阶段 中工作,并且您已经为您的 java 应用程序正确定义了适当的 build
阶段。但是,您需要另一个阶段来构建您的 docker 图像。我不太熟悉 Maven 以及为 mvn docker:push
步骤配置的内容,但我假设它是 docker build
和 docker push
命令的一个非常简单的包装器。
我建议将事情分成不同的阶段,并使用工件在容器之间传输构建的文件。
我认为您的 .gitlab-ci.yml
文件应该如下所示:
image: maven:3.3.9-jdk-8
stages:
- build_application
- build_image
# This stage builds your application
build_application:
stage: build_application
script:
- mvn clean install
artifacts:
paths:
- my-application.jar
build_image:
image: docker:latest
services:
- docker:dind
stage: build_image
# Remember that even though the JAR file was built in a separate image
# Gitlab CI will make it available in this image because I specified it in artifacts
#
# All I really need to build the Docker image is the artifact(s) & Dockerfile
script:
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
- docker build --no-cache=true -t registry.gitlab.com/me/myapp .
- docker push registry.gitlab.com/me/myapp