gitlab-ci.yml: как создать изображение docker с помощью dind - PullRequest
0 голосов
/ 06 августа 2020

У меня есть следующие logi c в моем GitLab-ci.yml:

stages:
  - build
  - deploy

variables:
    IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG

make_patch:
  image: node:10.19
  stage: build
  script:
    - npm install
    - make
    - make source-package
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
    - node_modules/
  artifacts:
    when:
    paths:
      - test.tar.bz2
    expire_in: 2 days

  test_feature:
    stage: deploy
    image: dockerhub_image:123
    script:
      - apt-get install bzip2
      - apt-get install curl -y
      - ls -lah
      - curl -kL https://mygitlabserver/namespace/project/-/jobs/artifacts/master/download?job=make_patch
      - tar -xvjf test.tar.bz2
      - docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
      - docker build --no-cache -t $IMAGE_TAG .
      - docker push $IMAGE_TAG

Итак, я пытаюсь протестировать изменения в моем репо, создав изображение nodejs; если он компилируется, я сохраняю zip-файл, содержащий все веб-файлы, которые необходимо использовать в потенциальной производственной системе. Затем я загружаю существующий образ из хаба publi c docker (поскольку это приложение с открытым исходным кодом, которое мы модифицируем). Я хочу обновить там веб-папку, а затем попытаться создать из нее контейнер docker и сохранить его в репозитории моего проекта. Как видно из вывода ниже, в настоящее время он не работает, потому что, как указал @marvin, dockerhub_image: 123 в не имеет docker cli.

523$ docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
524/bin/bash: line 107: docker: command not found
525[cmd] sh exited 1
526[cont-finish.d] executing container finish scripts...
527[cont-finish.d] done.
528[s6-finish] waiting for services.
529[s6-finish] sending all processes the TERM signal.
530[s6-finish] sending all processes the KILL signal and exiting.
532ERROR: Job failed: exit code 1

Я определил токен развертывания в мой проект выглядит так:

Name: webtoken
Username: webtoken-1
Created: Aug 6, 2020
Expires: Never
Scopes
read_repository, read_registry, write_registry, read_package_registry, write_package_registry

Я нашел этот пост: Gitlab CI - docker: команда не найдена

Но у меня проблемы понимание времени, где я бы включил ссылку на изображение docker в моем случае. Или я могу просто добавить пункт услуг в это задание "test_feature"?

services:
  - docker:dind

Извините за исправительные вопросы. Я просто новичок во всем docker и GitLab. Я попытался изменить задание test_feature вот так, но все равно не удалось с той же ошибкой:

  test_feature:
    stage: deploy
    image: dockerhub_image:123
    services:
      - docker:dind
    script:
      - apt-get install bzip2
      - apt-get install curl -y
      - ls -lah
      - curl -kL https://mygitlabserver/namespace/project/-/jobs/artifacts/master/download?job=make_patch
      - tar -xvjf test.tar.bz2
      - docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
      - docker build --no-cache -t $IMAGE_TAG .
      - docker push $IMAGE_TAG

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

Чтобы расширить ответ @Alessandro Chitolina:

Во-первых, если вы хотите увидеть весь рабочий пример сборки Docker с использованием метода docker -in- docker внутри GitLab CI, один из них - доступно здесь .

Во-вторых, если я не знаю, как что-то делать в GitLab CI, я считаю полезным проверять шаблоны Auto DevOps . Один для сборки Docker с использованием docker -in- docker доступен здесь . Вы даже можете напрямую импортировать его в свой конвейер, как описано здесь .

Наконец, вместо подхода docker -in- docker, вы также можете использовать kaniko , как описано здесь .

В качестве примечания - нет необходимости вручную загружать артефакт из make_patch в test_feature задании - он будет загружен автоматически - см. подробности здесь .

1 голос
/ 06 августа 2020

Вы не используете изображение docker в качестве исполнителя.

Это взято из рабочего задания по созданию образа docker:

build:
    image: docker:latest
    stage: build
    services:
        - docker:dind
    variables:
        DOCKER_HOST: tcp://docker:2375
        DOCKER_TLS_CERTDIR: ''
    script:
        - docker build -t xxx .
...