GNU创建Docker容器并使用图像id

GNU创建Docker容器并使用图像id,docker,makefile,gnu,Docker,Makefile,Gnu,我试图创建一个配方,在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 execut

我试图创建一个配方,在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_标记,然后继续创建容器。第一次出错时,$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映像已存在?

Pro提示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

如果您使用的是$eval。。或者$shell。。。在食谱中,你几乎总是做错事。你能解释一下为什么在配方中使用$eval或$shell不好吗?首先,配方已经在shell中运行,所以$shell。。。充其量是多余的。第二,$eval。。。更改make的全局状态,因此在配方中运行它充其量只是误导。这些都是很好的理由。但更重要的是,从实践的角度来看,人们对配方的扩展感到困惑:make在开始运行之前扩展了整个配方。