2016-12-31 4 views
1

Я новичок в Docker, но у меня есть проект веб-приложений Java, для которого моя сборка Maven создает и устанавливает изображение Docker. т.е.Установите Docker в контейнер для использования GitLab CI build

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 

Я используя Maven плагин Spotify, чтобы построить это, что я могу затем развернуть в хранилище с помощью:

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 как сервис:

services: 
    - docker:1.13-rc 

Но результат тот же - это, кажется, услуги предназначены для можно использовать в качестве внешних служб, которые могут быть подключены к, но они не установлены сразу в одном контейнере.

Как мне поступить, обновляя файл .yml, чтобы сборка GitLab могла строить и нажимать изображение Docker?

ответ

3

Я думаю, вы очень близки.

Gitlab работает в этапах, и вы правильно определили подходящий этап для вашего приложения java. Однако вам нужен еще один этап, который затем построит ваше изображение докеров. Я не так хорошо знаком с Maven и настроен для вашего шага mvn docker:push, но я собираюсь предположить, что это довольно простая обертка вокруг команд docker build и docker 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

Смежные вопросы