在容器中安装Docker,供GitLab CI构build使用

我是Docker的新手,但有一个Java Web应用程序项目,我的Maven构build生成并安装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插件来构build这个,然后我可以使用以下方法将其部署到存储库:

 mvn docker:push 

这很好。 但是:我使用CI的GitLab,我的.gitlab-ci.yml文件包含:

 image: maven:3.3.9-jdk-8 build: script: "mvn clean install && mvn docker:push" 

这几乎工作,但因为Docker没有安装在我的运行构build的容器中失败:

 [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) ... 

看来这里的解决scheme是将Docker安装到容器中。 我找不到具有Java,Maven Docker的预构build映像,但是我尝试将Dockerconfiguration为服务:

 services: - docker:1.13-rc 

但结果是一样的 – 看起来服务是作为可以连接的外部服务使用的,但是并不是立即安装在同一个容器中。

我应该如何更新我的.yml文件,以便GitLab构build可以构build并推送Docker镜像?

我觉得你非常接近。

Gitlab分阶段工作,并且你已经正确地为你的Java应用程序定义了一个正确的build阶段。 但是,你需要另外一个阶段,然后build立你的docker形象。 我不是那么熟悉Maven以及为你的mvn docker:pushconfiguration了什么mvn docker:push step,但是我将假设它是docker builddocker push命令的一个非常简单的包装。

我build议分离出不同的阶段,并使用工件在容器之间传输构build的文件。

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