/bin/sh:1:语法错误:dockerfile中未终止的带引号字符串



我需要在文件constants.js中有一个带引号的变量('here variable'(。试图在dockerfile中做这件事,但得到了他的错误,无法解决。尝试转义引号,但不起作用。用双引号做这件事-有效,但我需要单引号。知道吗?

FROM debian:stretch-slim

ENV GIT_BRANCH=develop
ENV GIT_COMMIT_TAG=26bf94075e6d5f2c575a291680e905e15aa0c81f

COPY constants.js .

RUN { 
/bin/bash -c '{ 
sed -i -r "s/^([[:blank:]]*APP_VERSION:[[:blank:]]*).*/1'${GIT_COMMIT_TAG:0:7}',/" constants.js ; 
}' ;     
}

CMD ["sleep", "inf"]

文件constants.js看起来像:

const constants = {
APP_NAME: 'app',
APP_VERSION: '10.0.0',
};
module.exports = {
constants,
};

#更新1

更长的

/bin/bash -c

Dockerfile:

if [ ! -z "$GIT_BRANCH" ]; then 
GIT_BRANCH="${GIT_BRANCH}/" ; 
fi ; 
echo "${GIT_BRANCH}${GIT_COMMIT_TAG:0:7}" > .release.txt ; 
sed -i -r "s/^([[:blank:]]*APP_VERSION:[[:blank:]]*).*/1'${GIT_COMMIT_TAG:0:7}',/" constants.js ; 
appver=$(awk '"'"'/APP_VERSION/ { print $2 }'"'"' constants.js) ; 
echo "${appver:1:-2}" > .appversion ; 

所以这就是我使用bash-c的原因。

您不需要指定/bin/bash -c。相反,只需使用RUN并立即执行需要执行的命令。有必要移除一些额外的/。最终Dockerfile在下方给出

Dockerfile

FROM debian:stretch-slim
ENV GIT_BRANCH=develop
ENV GIT_COMMIT_TAG=26bf94075e6d5f2c575a291680e905e15aa0c81f
COPY constants.js .
RUN sed -i -r "s/^([[:blank:]]*APP_VERSION:[[:blank:]]*).*/1'$GIT_COMMIT_TAG:0:7',/" constants.js ;
CMD ["sleep", "inf"]

生成的constants.js文件

const constants = {
APP_NAME: 'app',
APP_VERSION: '26bf94075e6d5f2c575a291680e905e15aa0c81f:0:7',
};
module.exports = {
constants,
};

UPD#1

对于执行一些不适合一行的逻辑,最好的解决方案是将其放在一个单独的bash脚本中。

因此,添加setup.sh并更改Dockerfile

Dockerfile

FROM debian:stretch-slim
ENV GIT_BRANCH=develop
ENV GIT_COMMIT_TAG=26bf94075e6d5f2c575a291680e905e15aa0c81f
COPY ["constants.js", "setup.sh", "./"]
RUN chmod +x ./setup.sh && ./setup.sh

设置.sh

if [ ! -z "$GIT_BRANCH" ]; then
GIT_BRANCH="${GIT_BRANCH}/"
fi
CUTTED_GIT_COMMIT_TAG=$(echo "$GIT_COMMIT_TAG" | cut -c -7)
echo "${GIT_BRANCH}${CUTTED_GIT_COMMIT_TAG}" > .release.txt
sed -i -r "s/^([[:blank:]]*APP_VERSION:[[:blank:]]*).*/1'${CUTTED_GIT_COMMIT_TAG}',/" constants.js
APP_VERSION=$(awk '"'"'/APP_VERSION/ { print $2 }'"'"' constants.js)
CUTTED_APP_VERSION=$(echo "$appver" | cut -c 2- | rev | cut -c 1- | rev)
echo $CUTTED_APP_VERSION > .appversion

好的,所以sed应该是这样的:

sed -r -i  "/APP_VERSION/ s/'''(.*)'''/'''${GIT_COMMIT_TAG:0:7}'''/" constants.js ; 

然后它就可以正常工作了。

相关内容

  • 没有找到相关文章

最新更新