我们正在尝试将容器名称存储在我的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
答案 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 cp
,docker 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" "$@"