GNU делает создание контейнера Docker и использование идентификатора изображения - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь создать рецепт, который будет выполнять результаты моего пуха внутри моего docker контейнера, и скопировать results.xml вне контейнера. Вот мой рецепт:

lint-results:
    docker build --target lint path_to_my_src_dir -t $(my_lint_image_tag)
    $(eval tmp_lint_container_id:=$(shell docker create $(my_lint_image_tag))) # This step seems to execute too quick
    @echo my lint constainer id is $(tmp_lint_container_id)
    docker cp $(tmp_lint_container_id):/usr/src/app/results.xml ./
    docker rm -v $(tmp_lint_container_id)

У меня проблема в том, что после успешного создания $(my_lint_image_tag) из сборки docker и перехода к созданию контейнера. Первый раз, когда происходит ошибка, вывод эхосигнала для $(tmp_lint_container_id) будет пустым, но если я запустлю его снова, это сработает. Кажется, он только в первый раз завершается ошибкой, если изначально изображение отсутствовало, почти как при запуске команды shell для быстрого создания образа docker.

Вот фрагмент кода, если вывод ошибки:

Removing intermediate container a6f4eb8ac404
 ---> 01cb85644929
Successfully built 01cb85644929
Successfully tagged my-lint-image-1.1.1.1:latest
my lint constainer id is
docker cp :/usr/src/app/results.xml ./
must specify at least one container source
make: *** [lint-results] Error 1

Есть ли способ убедиться, что docker образ существует до запуска команды shell?

1 Ответ

1 голос
/ 06 апреля 2020

Pro Совет № 1: Если вы используете $(eval ..) или $(shell ...) внутри рецепта, вы почти всегда делаете что-то не так.

Используйте переменные оболочки, а не переменные, для хранения значений внутри рецептов , Как это:

lint-results:
        docker build --target lint path_to_my_src_dir -t $(my_lint_image_tag)
        tmp_lint_container_id=$$(docker create $(my_lint_image_tag)) && \
        docker cp $$tmp_lint_container_id:/usr/src/app/results.xml ./ && \
        docker rm -v $$tmp_lint_container_id
...