gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:30:02 24 4
gpt4 key购买 nike

我们正在尝试将容器名称存储在我的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

从Jenkins执行makefile时,容器名称未显示在“ID”变量下方
ID:= 
/bin/sh: ID:=: command not found

最佳答案

就纯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" "$@"

关于docker - 将docker命令结果存储在Makefile中的变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64668013/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com