如何将SSH密钥作为getopt参数传递给docker构建



我有一个用bash编写的构建函数,它使用getopt获取参数。我正在用它来构建docker项目。因为项目的构建参数差异很大,所以我决定将构建参数作为getopt参数。它工作得很好,在生产设置中可以工作一段时间,所以总体功能没有问题。我已经将它集成到我所有的repo中,除了一个将SSH密钥作为构建参数的repo外,测试都是成功的。

在图像构建器功能中,参数如下所示,

TEMP_BUILD=$(getopt -o hw:v:b:s:d: --longoptions help,working-dir:,version-tag:,build-number:,service-name:,docker-build-arguments: -- "$@")
if [[ $? -ne 0 ]]; 
then
echo "Failed to parse options...exiting." >&2 ; 
exit 1;
fi
eval set -- "$TEMP_BUILD"
# extract options and their arguments into variables.
while true ; do
case "$1" in
-h|--help)
HELP="true" ; shift ;;
-w|--working-dir)
case "$2" in
"") WORKING_DIR='' ; shift 2 ;;
*) WORKING_DIR=$2 ; shift 2 ;;
esac ;;
-v|--version-tag)
case "$2" in
"") VERSION_TAG='' ; shift 2 ;;
*) VERSION_TAG=$2 ; shift 2 ;;
esac ;;
-b|--build-number)
case "$2" in
"") BUILD_NUMBER='' ; shift 2 ;;
*) BUILD_NUMBER=$2 ; shift 2 ;;
esac ;;
-s|--service-name)
case "$2" in
"") SERVICE_NAME='' ; shift 2 ;;
*) SERVICE_NAME=$2 ; shift 2 ;;
esac ;;
-d|--docker-build-arguments)
case "$2" in
"") DOCKER_BUILD_ARGUMENTS='' ; shift 2 ;;
*) DOCKER_BUILD_ARGUMENTS=$2 ; shift 2 ;;
esac ;;
--) shift ; break ;;
*) echo "Invalid Parameter!" ; exit 1 ;;
esac
done

通常情况下,我以的身份运行该功能

image-builder --working-dir "$(pwd)" --version-tag "tag" --build-number "xx" --service-name "service" --docker-build-arguments "--build-arg ARG1=argument-1 --build-arg ARG2=argument-2"

脚本中的docker构建行是这样运行的;

docker build -t $SERVICE_NAME:$VERSION_TAG.$BUILD_NUMBER -f $WORKING_DIR/Dockerfile .

在这里之前,我解释了我的设置,这是我的问题,

正如我所说,一个项目需要SSH密钥docker build中传递,所以当我尝试时

image-builder --working-dir "$(pwd)" --version-tag "tag" --build-number "xx" --service-name "service" --docker-build-arguments "--build-arg SSH_PRIVATE_KEY=$(cat ~/.ssh/id_rsa) --build-arg SSH_PUBLIC_KEY=$(cat ~/.ssh/id_rsa.pub)"

它给bad flag syntax: -----END

这个错误有很多问题,通常建议重复引用关键字。当我尝试双引号的关键变量如下,

image-builder --working-dir "$(pwd)" --version-tag "tag" --build-number "xx" --service-name "service" --docker-build-arguments "--build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)" --build-arg SSH_PUBLIC_KEY="$(cat ~/.ssh/id_rsa.pub)""

函数是将键的某些部分识别为参数并返回getopt: unrecognized option '-----END'错误。

我甚至试图将我的密钥转换为base64,正如另一个问题中所建议的那样,但也返回了一个错误,因为在构建阶段,该项目试图从bitbucket和bitbucket中提取其他存储库,并且由于bad format,bitbucket为SSH密钥返回permission denied

,我有点纠结于该怎么办

如有任何帮助,我们将不胜感激。

如果您写:,则不能使用相同类型的引号对某些内容进行双引号引用

image-builder "--build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)""

你实际上有三个受威胁的字符串:

  • "--build-arg SSH_PRIVATE_KEY="
  • $(cat ~/.ssh/id_rsa)
  • ""

正如您所看到的,您的cat扩展仍然未被引用。你可以试着写:

image-builder "--build-arg SSH_PRIVATE_KEY='$(cat ~/.ssh/id_rsa)'"

请注意在内部表达式中使用单引号('(。但是,您可能还需要考虑避免一些引用问题,方法是在image-builder脚本中添加一个显式参数,该参数将路径带到密钥文件,然后在脚本中生成适当的--build-arg命令。所以你可以这样称呼它:

image-builder --ssh-key ~/.ssh/id_rsa

在你的脚本中,你会做一些类似的事情:

docker build ... --build-arg SSH_PRIVATE_KEY="$(cat $SSH_PRIVATE_KEY)"

最新更新