2016-12-31 143 views
1

我是Docker的新手,但拥有一个Java Web应用程序项目,我的Maven构建可以生成并安装Docker镜像。即在容器中安装Docker以供GitLab使用CI构建

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的多克尔预建的形象,但我没有尝试配置码头工人作为一种服务:

services: 
    - docker:1.13-rc 

但结果是一样的 - 这似乎服务意味着作为外部服务使用,其连接到可以是,但不会立即安装在同一容器内。

我应该怎么去更新我的.yml文件,以便GitLab构建可以构建并推送Docker镜像?

回答

3

我觉得你很亲密。

Gitlab在阶段中工作,并且您已经正确地为您的java应用程序定义了一个合适的build阶段。但是,您需要另一个阶段来构建您的泊坞窗图像。我并不是那么熟悉Maven,并且为mvn docker:push步骤配置了什么,但是我会假设它是一个非常简单的包装,围绕着docker builddocker 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 
+0

这是超级有帮助本,感谢您的澄清 - 我给事物的快速旋转,让你知道如何去。 –

+0

这也是我提出的解决方案。不过,我会有兴趣看到一个适用于docker maven插件的解决方案。 – rolve

+0

@rolve这当然是可能的,但更多的参与。你必须做的是有一个既有'mvn'又有'docker'的图像。我会看看每个图像的Dockerfiles,以便创建适合您的目的的另一个图像。 – Ben