【问题标题】:/bin/sh: 1: Syntax error: Unterminated quoted string in dockerfile/bin/sh: 1: 语法错误:dockerfile 中未终止的带引号的字符串
【发布时间】:2020-12-15 13:39:05
【问题描述】:

我需要在文件 constants.js 中有带引号的变量(“此处变量”)。尝试在 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,
};

#UPDATE1

更长

/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 的原因。

【问题讨论】:

  • 嗯...很难跟踪引用。您是否在GIT_COMMIT_TAG 周围的单引号前尝试了双反斜杠? \\'\${GIT_COMMIT_TAG:0:7}\\'
  • 为什么要运行 /bin/bash?做什么的?重点是什么?为什么不只是命令?
  • @maitza 为什么不只是RUN sed ...?!
  • 对不起,这不仅仅是 sed,我做了更多的 bash 命令,这就是我使用 bash -c 的原因。

标签: bash docker shell dockerfile posix


【解决方案1】:

您无需指定/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

setup.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

【讨论】:

  • 我使用 bash -c 因为它不是一个命令。可能,我的错,我把这个 Dockerfile 做空了。
  • @maitza,试试这个方法,报告成功)
  • ./setup.sh: 5: ./sed.sh: Bad substitution 因为 $,做 /$ 工作正常,但是它没有把它当作变量,就像字符串一样..
  • :0:7 它只是将长提交哈希缩短为短 (7)。
  • 并且只通过 bash 脚本执行它,它的工作,但使用 Dockerfile 看起来像那样
【解决方案2】:

好的,sed 应该是这样的:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 2019-12-09
    • 2017-02-10
    • 1970-01-01
    • 2017-07-03
    相关资源
    最近更新 更多