我正在尝试创建一个配方,该配方将在docker容器内执行我的lint结果,并在容器外复制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)
我遇到的问题是,它成功地从docker构建中创建了$(my_lint_image_tag)
,然后继续创建容器。第一次出现错误,并且$(tmp_lint_container_id)
的回显输出为空白,但是如果再次运行它,它将起作用。它似乎仅在第一次出现故障时才出现,如果最初不存在该映像,几乎就像在构建docker映像后迅速运行shell
命令一样。
如果出现错误,则显示摘录:
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
[运行shell
命令之前是否有办法确保Docker映像在其中?
专业提示1:如果在食谱中使用$(eval ..)
或$(shell ...)
,则几乎总是在做错事。
使用shell变量而不是make变量将值保存在配方中。像这样:
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