maven - 在容器中安装 Docker 供 GitLab CI 构建使用

标签 maven docker gitlab docker-compose gitlab-ci

我是 Docker 新手,但有一个 Java Web 应用程序项目,我的 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

效果很好。 但是:我使用 GitLab 进行 CI,我的 .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 应用程序正确定义了适当的构建阶段。但是,您需要另一个阶段来构建您的 docker 镜像。我不太熟悉 Maven 以及为 mvn docker:push 步骤配置的内容,但我假设它是围绕 docker build 的一个非常简单的包装器> 和docker Push 命令。

我建议将事情分成不同的阶段,并使用 Artifact 在容器之间传输构建的文件。

我想你的 .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

关于maven - 在容器中安装 Docker 供 GitLab CI 构建使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41411593/

相关文章:

ruby - 在 Linux Docker 容器上运行时出现 gsub 编码错误 US-ASCII 中的字节序列无效

postgresql - 升级到 Ubuntu 18.04 后 Gitlab 无法启动

java - 排除后类路径包含多个 SLF4J 绑定(bind)

java - 为模块创建maven junit测试库

java - 如何解决使用GluonHQ客户端、Native Image和GraalVM编译的JavaFX项目中的fxml加载异常?

ubuntu - 在 Ubuntu 上启动 Docker 作为守护进程

linux - 将主机端口转发到 docker 容器

gitlab - gitlab-ci SSH key 无效格式

Gitlab 使用 Let's Encrypt 证书 : upgrade your ACME client to ACMEv2

java - 如何切换maven项目?