GNU make 创建 Docker 容器并使用图像 ID

GNU make creating Docker container and using Image id

我正在尝试创建一个配方,它将在我的 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

有没有办法确保 docker 图像在 shell 命令 运行 之前存在?

专业提示 #1:如果您在食谱中使用 $(eval ..)$(shell ...),您几乎总是会做错事。

使用 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