我需要在文件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 ;
然后它就可以正常工作了。