在Gitlab中运行带有Docker命令替换的部署

53次阅读
没有评论

问题描述

在Gitlab中尝试运行以下命令作为部署的一部分,但遇到了问题。

TIMESTAMP=$(date +%s) docker stack deploy --with-registry-auth --compose-file $(`printf "docker-compose.%s.unimark.yaml" "$SRV_DEPLOY_ENV"`) unimark

他遇到了以下错误,但不确定出了什么问题。

/bin/sh: eval: line 332: docker-compose.demo.unimark.yaml: not found"docker stack deploy" requires exactly 1 argument.See 'docker stack deploy --help'.Usage:  docker stack deploy [OPTIONS] STACKDeploy a new stack or update an existing stack

他还尝试了另一种方法:

DOCKER_COMPOSE_DEPLOY_FILE=`printf "docker-compose.%s.unimark.yaml" "$SRV_DEPLOY_ENV"`TIMESTAMP=$(date +%s) docker stack deploy --with-registry-auth --compose-file $($DOCKER_COMPOSE_DEPLOY_FILE) unimark

但仍然遇到了相同的错误,指示找不到docker-compose文件。他确认该文件确实存在于相同的目录下。他不确定是否与bashsh的问题有关。

解决方案

请注意以下操作注意版本差异及修改前做好备份。
在这种情况下,错误似乎是由于Bash命令替换造成的。你可以尝试以下方法来解决这个问题。

方案1:修正命令替换

错误提示中提到了docker-compose文件的问题,这可能与命令替换的语法有关。Bash中使用反引号(`)或$()来执行命令替换,但在你的命令中出现了问题。你可以尝试删除或修改命令替换的部分。

原命令:

TIMESTAMP=$(date +%s) docker stack deploy --with-registry-auth --compose-file $(`printf "docker-compose.%s.unimark.yaml" "$SRV_DEPLOY_ENV"`) unimark

修正后的命令:

TIMESTAMP=$(date +%s) docker stack deploy --with-registry-auth --compose-file $(printf "docker-compose.%s.unimark.yaml" "$SRV_DEPLOY_ENV") unimark

方案2:使用变量

另一种方法是将DOCKER_COMPOSE_DEPLOY_FILE变量设置为docker-compose文件的路径,然后在命令中直接引用这个变量。

DOCKER_COMPOSE_DEPLOY_FILE=$(printf "docker-compose.%s.unimark.yaml" "$SRV_DEPLOY_ENV")
TIMESTAMP=$(date +%s) docker stack deploy --with-registry-auth --compose-file $DOCKER_COMPOSE_DEPLOY_FILE unimark

请注意,这两种方法都应该能够解决命令替换导致的问题。如果仍然遇到问题,你可能需要检查环境变量SRV_DEPLOY_ENV的值是否正确,以及docker-compose文件是否在正确的位置。

方案3:引用环境变量

如果你的环境变量值包含特殊字符,可能会影响命令替换的结果。你可以尝试在引用环境变量时使用双引号,以确保特殊字符被正确解析。

TIMESTAMP=$(date +%s) docker stack deploy --with-registry-auth --compose-file $(printf "docker-compose.%s.unimark.yaml" "$SRV_DEPLOY_ENV") unimark

方案4:调试命令替换

如果问题仍然存在,你可以按照链接(https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html)中的说明,启用追踪功能来查看命令替换后的实际命令。这有助于你更好地理解命令替换的结果,从而找出问题所在。

结论

通过修正命令替换的语法或尝试其他方法,你应该能够解决在Gitlab中使用Docker命令替换的问题。如果问题仍然存在,可以考虑检查环境变量和文件路径是否正确,以及查看实际执行的命令以进行进一步的调试。

正文完