在容器中安装Docker以供GitLab CI build

时间:2016-12-31 20:43:34

标签: 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"

这几乎可以正常工作,但由于未在我的容器中安装 而运行构建

,因此失败了

[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镜像?

1 个答案:

答案 0 :(得分:5)

我认为你很亲密。

Gitlab在阶段工作,你已经为你的java应用程序正确定义了一个合适的build阶段。但是,您需要另一个阶段,然后构建您的docker镜像。我并不熟悉Maven以及为mvn docker:push步骤配置的内容,但我将假设它是围绕docker builddocker push命令的非常简单的包装器。 / p>

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

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