所以,我有一个经过测试的Docker build命令,效果很好
docker build -t app --no-cache --network host --build-arg ssh_private_key="$(cat ~/.ssh/id_rsa)" --build-arg python_version="3.6.8" -f Dockerfile .
为减轻团队学习Docker的痛苦,我将一些命令(生成,启动,停止)封装在Makefile中。但是,在Makefile中,我需要通过修改来稍微更改命令
$(cat ~/.ssh/id_rsa)
到
$(shell cat ~/.ssh/id_rsa)
当我执行以下操作时:
make build
我收到以下消息:
Step 13/20 : RUN git clone --depth 1 "${git_user}@${git_host}:${git_repo}" app
---> Running in d2eb41a71315
Cloning into 'app'...
Warning: Permanently added the ECDSA host key for IP address [ip_address] to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.
但是,从命令行执行时,我没有相同的问题。我认为这与调用“ cat”命令的方式有关,但是我不知道解决方法。
有什么想法吗?
Makefile:
APP_NAME=ccs_data_pipeline
DATA?="${HOME}/data"
DOCKER_FILE=Dockerfile
PYTHON_VERSION?=3.6.8
SRC?=$(shell dirname `pwd`)
PRIVATE_KEY?=$(shell echo $(shell cat ~/.ssh/id_rsa))
.PHONY: help
help: ## Display this help message
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
build: ## Build container for ccs data pipeline
docker build -t $(APP_NAME) --no-cache --network host --build-arg ssh_private_key="$(PRIVATE_KEY)" --build-arg python_version="$(PYTHON_VERSION)" -f $(DOCKER_FILE) .
start: ## Start the docker container
docker run -it -v $(DATA):/data --network host --rm --name="$(APP_NAME)" $(APP_NAME)
stop: ## Stop the docker container
docker stop $(APP_NAME); docker rm $(APP_NAME)
答案 0 :(得分:0)
请显示您的实际makefile,或至少显示存在错误的整个规则。您提供的没有上下文的单个命令不足以了解您在做什么或可能出了什么问题。
请注意,用make shell命令$(...)
代替$(shell ...)
这样的shell操作通常是不正确的。但是,有时这些命令会“偶然地”工作,因为这些命令之间的真正差异并不重要。
通常,您永远不要在食谱中使用$(shell ...)
(我不知道此命令是否出现在食谱中)。相反,您应该在运行配方时将要逐字传递到外壳的所有美元符号转义:
$$(cat ~/.ssh/id_rsa)