将Docker命令结果存储在Makefile中的变量中

时间:2020-11-03 17:54:13

标签: docker makefile

我们正在尝试将容器名称存储在我的Makefile中,但是在执行构建时出现以下错误,请告知。谢谢。

   .PHONY: metadata
metadata: .env1 
  docker pull IMAGE_NAME
  docker run  $IMAGE_NAME;
  ID:= $(shell docker ps --format '{{.Names}}')
  @echo ${ID}
  docker cp ${ID}:/app/.env .env2
  

从詹金斯执行makefile时,容器名称未显示在“ ID”变量下方

ID:= 
/bin/sh: ID:=: command not found

1 个答案:

答案 0 :(得分:1)

就纯Docker机制而言,您可以做几件事来简化此操作。

docker run映像时,您可以指定一个备用命令:以映像名称后的任何内容作为要运行的映像。例如,您可以cat作为主容器命令,并将上面的所有内容替换为:

.PHONY: getmetadata
getmetadata: .env2
.env2: .env1
        docker run --rm \
          -e "ARTIFACTORY_USER=${ARTIFACTORY_CREDENTIALS_USR}" \
          -e "ARTIFACTORY_PASSWORD=${ARTIFACTORY_CREDENTIALS_PSW}" \
          --env-file .env1 \
          "${ARTIFACTDATA_IMAGE_NAME}" \
          cat /app/.env \
        > $@

(通常最好避免使用docker cpdocker exec和其他命令式命令;这是相当便宜的做法,也是在需要时运行新容器的更好实践。)

如果无法执行此操作,则可以docker run --name选择名称,然后在docker cp选项中使用该容器名称。

.PHONY: getmetadata
getmetadata: .env2
.env2: .env1
        docker run --name getmetadata ...
        docker cp getmetadata:/app/.env $@
        docker stop getmetadata
        docker rm getmetadata

如果您真的无法避免这种情况,则Makefile的每一行都在单独的shell中运行。一方面,这意味着如果希望一行中的变量在以后的行中可见,则需要将行连接在一起。另一方面,这意味着您具有正常的Shell功能,并且不需要使用GNU Make $(shell ...)扩展名(该扩展名将评估Makefile的加载时间,而不是运行命令的时间)。

.PHONY: getmetadata
getmetadata: .env2
.env2: .env1
        # Note here:
        # $$ escapes $ for the shell
        # Multiple shell commands joined together with && \
        # Beyond that, pure Bourne shell syntax
        ID=$$(docker run -d ...) && \
        echo "$$ID" && \
        docker cp "$$ID:/app/.env" "$@"