2016-12-31 145 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