Как использовать файлы, созданные на этапе сборки с Dockerfile на том же этапе? - PullRequest
0 голосов
/ 22 января 2019

Я практикуюсь с Gitlab CI, чтобы понять, как создать приложение, а затем использовать его в образе Docker.На данный момент мой репо состоит просто из helloworld.txt, dockerfile и gitlab-ci.yml.

ПРОБЛЕМА: На этапе сборки я использую обработчик оболочки для zip helloworld.zip helloworld.txt ". Затем я" докер build -t myproject / myapp. ", Где я ожидаю скопировать helloworld.zip/ "но кажется, что созданный мною zip-файл недоступен в контексте сборки Docker.Я не сохраняю файл helloworld.zip в нужном месте?Или что-то другое?Мое долгосрочное намерение - написать приложение на Python, а на этапе сборки скомпилировать в один исполняемый файл и скопировать в контейнер докера.

#cat helloworld.txt
hello world

#cat dockerfile
FROM centos:7
COPY helloworld.zip /
CMD ["/bin/bash"]

#cat gitlab-ci.yml
stages:
    - build
    - test
    - release
    - deploy

variables:
  IMAGE_TEST_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
  IMAGE_RELEASE_NAME: $CI_REGISTRY_IMAGE:latest

before_script:
  - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" "$CI_REGISTRY" --password-stdin

build:
  stage: build
  script:
    - echo "compile the program"
    - zip zipfile.zip helloworld.txt 
    - docker build --pull -t $IMAGE_TEST_NAME .
    - docker push $IMAGE_TEST_NAME

test:
  stage: test
  script: 
    - docker pull $IMAGE_TEST_NAME
    - docker run $IMAGE_TEST_NAME yum install unzip -y && unzip /helloworld.zip && cat /helloworld.txt

release:
  stage: release
  script:
    - docker pull $IMAGE_TEST_NAME
    - docker tag $IMAGE_TEST_NAME $IMAGE_RELEASE_NAME
    - docker push $IMAGE_RELEASE_NAME
  only:
    - master

deploy:
  stage: deploy
  script:
    - ./deploy.sh
  only:
    - master
  when: manual

Я ожидаю, что на том же этапе (в данном случае сборка) я могу запустить такую ​​программу, как zip, а затем скопировать этот zip-файл в заданный каталог во вновь созданном образе докера во время докераПроцесс сборки.

РЕДАКТИРОВАТЬ

Узнав, что я не могу этого сделать, я создал два разных этапа: build_app и build_container.Также зная, что артефакты используются по умолчанию на следующих этапах, я не добавил артефакты на первом этапе или зависимости на следующем этапе.Это файл gitlab-ci.yml, приведенный ниже, и он по-прежнему выдает ту же ошибку.

stages:
    - build_app
    - build_container
    - test
    - release
    - deploy

# you can delete this line if you're not using Docker
#image: centos:latest
variables:
  IMAGE_TEST_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
  IMAGE_RELEASE_NAME: $CI_REGISTRY_IMAGE:latest

before_script:
  - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" "$CI_REGISTRY" --password-stdin

build_app:
  stage: build_app
  script:
    - echo "compile the program"
    - zip zipfile.zip helloworld.txt 

build_container:
  stage: build_container
  script:
    - docker build --pull -t $IMAGE_TEST_NAME .
    - docker push $IMAGE_TEST_NAME

test:
  stage: test
  script: 
    - docker pull $IMAGE_TEST_NAME
    - docker run $IMAGE_TEST_NAME yum install unzip -y && unzip /helloworld.zip && cat /helloworld.txt

release:
  stage: release
  script:
    - docker pull $IMAGE_TEST_NAME
    - docker tag $IMAGE_TEST_NAME $IMAGE_RELEASE_NAME
    - docker push $IMAGE_RELEASE_NAME
  only:
    - master

deploy:
  stage: deploy
  script:
    - ./deploy.sh
  only:
    - master
  when: manual

Статус задания: сборка приложения: выполнено сборка контейнера: сбой

Running with gitlab-runner 11.6.1 (8d829975)
  on gitrunner-shell trtHcQTS
Using Shell executor...
Running on gitrunner.example.com...
Fetching changes...
Removing zipfile.zip
HEAD is now at e0a0a95 Update .gitlab-ci.yml
Checking out e0a0a952 as newFeature...
Skipping Git submodules setup
$ echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" "$CI_REGISTRY" --password-stdin
WARNING! Your password will be stored unencrypted in /home/gitlab-runner/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
$ docker build --pull -t $IMAGE_TEST_NAME .
Sending build context to Docker daemon  112.1kB

Step 1/3 : FROM centos:7
7: Pulling from library/centos
Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Status: Image is up to date for centos:7
 ---> 1e1148e4cc2c
Step 2/3 : COPY helloworld.zip /
COPY failed: stat /var/lib/docker/tmp/docker-builder312764301/helloworld.zip: no such file or directory
ERROR: Job failed: exit status 1

1 Ответ

0 голосов
/ 22 января 2019

Это невозможно. Модель работы Gitlab CI предполагает, что задания одной и той же стадии независимы.

См. Руководство для ключевого слова dependencies в gitlab-ci.yml:

Эта функция [...] позволяет вам определять артефакты для передачи между различными заданиями.

Обратите внимание, что артефакты всех предыдущих этапов передаются по умолчанию.

[...] Вы можете определять задания только из этапов, которые выполняются до текущего.

...