@EmachinesDIMA
junior DevOps

Как правильно объявить сохранение артефакта с томами Docker?

1. тома даёт создавать только в директории сборки.
2. путь на хосте для тома не создаётся автоматически, поэтому создаю директорию ${CI_PROJECT_DIR} и её указываю как путь для артефактов.
3. том содержит путь : "путь_на_хосте_в_папке_сборки : путь_в_контейнере : права_чтения_записи"

4. сборка проходит. артефакт "создаётся". В кавычках, потому что внутри по пути артефакта пусто.

0. оф и не оф мануалы перечитал вдоль и поперёк.

Получаю ошибку:
Uploading artifacts... found 1 matching files and directories ...
Uploading artifacts as "archive" to coordinator... ok id=632087 responseStatus=201 Created token=roSNWzgE
+ exit 0


Есть успешный вывод и якобы артефакт есть:
Job artifacts
These artifacts are the latest. They will not be deleted (even if expired) until newer artifacts are available.


Но там "empty" ...

----------------------------------------------

Структура объявления тома:
docker-compose.yml


services:
  app:
    build:
      dockerfile: Dockerfile
      context: .
    volumes:
      - "vlm:/var/www/app:rw"

volumes:
  vlm:
    external:
      name: /var/www/app


.gitlab-ci.yml


upload:
  variables:
    COMPOSE_FILE: docker-compose.yml
    CI_DEBUG_TRACE: "true"
  tags:
    - docker
  stage: upload
  script:
    - echo $CI_JOB_STAGE
    - mkdir -p ${CI_PROJECT_DIR}/tmp/var/www/app
    - docker-compose build --force-rm --no-cache
  artifacts:
    name: "artifact-$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
    paths:
      - ${CI_PROJECT_DIR}/tmp/var/www/app
    expire_in: 1h
    when: always
  when:
    manual
  • Вопрос задан
  • 618 просмотров
Решения вопроса 1
@mureevms
Предположение 1:
> Uploading artifacts... found 1 matching files and directories

Он нашел одно совпадение. Быть может это именно каталог ${CI_PROJECT_DIR}/tmp/var/www/app, в котором не обнаружил файл artifact-$CI_JOB_NAME-$CI_COMMIT_REF_NAME. Для решения попробовать указать вместо вашего варианта, так. Не понятно как и какой файл создается в этом каталоге, вы этого не показывает, вероятно он просто не подходит под шаблон.
artifacts:
    when: always
    paths:
      - "${CI_PROJECT_DIR}/tmp/var/www/app/*" # именно в кавычках


Предположение 2:
Раннер запускается от своего пользователя, а файл создается от пользователя, под которым запускается процесс в контейнере, как правило, это рут, поэтому имеет смысл попробовать перед docker-compose дать 777 права на этот каталог:
script:
    - chmod 777 ${CI_PROJECT_DIR}/tmp/var/www/app


Предположение 3:
Маловероятно, вы же проверили, но на всякий случай проверьте еще раз, смущает частое упоминание /var/www/app в разных вариациях и не уверен, что это один и тот же каталог для хоста и контейнера. Например, ${CI_PROJECT_DIR}/tmp/var/www/app каталог для раннера это не одно и тоже, что и для контейнера.

И последнее:
Вы монтируете каталог /var/www/app, а создаете ${CI_PROJECT_DIR}/tmp/var/www/app
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы