【问题标题】:Docker ENV value from printf does not work来自 printf 的 Docker ENV 值不起作用
【发布时间】:2021-01-24 19:37:11
【问题描述】:

我的场景有点复杂:

  1. 我的Dockerfile 中有一个环境变量,它是一个路径:ENV ORACLE_HOME=/home/oracle
  2. 我需要稍后做一些文件操作,所以我使用 sed
  3. 不幸的是,在我使用变量之前,我需要为 sed 转义路径字符 \

这就是我所拥有的:

ENV ORACLE_HOME=/home/oracle
ENV ORACLE_HOME_ESCAPED="$(printf '%q\n' "$ORACLE_HOME")"
RUN sed 's/.*pattern.*/\"-Dsomekey='${ORACLE_HOME_ESCAPED}'\"/' file

如果ORACLE_HOME 仅包含简单字符,则RUN 行可以正常工作。 我使用printf 的转义命令在bash 中正常工作,但在Dockerfie 中不起作用。

不幸的是,我只有 GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu) 并且没有 bash 4.4 的更新,所以我无法使用 ${@Q} 表示法。我使用oraclelinux:7-slim 作为基础镜像。

关于printf 有什么问题有什么建议吗?

【问题讨论】:

标签: bash docker sed dockerfile


【解决方案1】:

关于 printf 有什么问题有什么建议吗?

printf 没有问题,但是变量的使用方式有问题

ENV 没有 运行一个可以扩展 $(...) 的 shell - ENV 是一个简单的 a=b 分配,没有扩展。

尝试以下操作并注意在扩展变量时如何使用引号,而不是分配它:

FROM alpine
ENV ORACLE_HOME="not simple characters?!@#^**^&()"
RUN set -x && \
    printf "%s\n" a pattern b > file && \
    # https://stackoverflow.com/questions/407523/escape-a-string-for-a-sed-replace-pattern
    ORACLE_HOME_ESCAPED_FOR_SED=$(printf '%s\n' "$ORACLE_HOME" | sed -e 's/[\/&]/\\&/g') && \
    sed 's/.*pattern.*/"-Dsomekey='"$ORACLE_HOME_ESCAPED_FOR_SED"'"/' file
# these quotes                     ^                            ^
# prevent word splitting

结果:

$ docker build .
...
Step 3/3 : RUN set -x &&     printf "%s\n" a pattern b > file &&     ORACLE_HOME_ESCAPED_FOR_SED=$(printf '%s\n' "$ORACLE_HOME" | sed -e 's/[\/&]/\\&/g') &&     sed 's/.*pattern.*/"-Dsomekey='"$ORACLE_HOME_ESCAPED_FOR_SED"'"/' file
 ---> Running in 9a98e726e145
+ printf '%s\n' a pattern b
+ printf '%s\n' 'not simple characters?!@#^**^&()'
+ sed -e 's/[\/&]/\\&/g'
+ ORACLE_HOME_ESCAPED_FOR_SED='not simple characters?!@#^**^\&()'
+ sed 's/.*pattern.*/"-Dsomekey=not simple characters?!@#^**^\&()"/' file
a
"-Dsomekey=not simple characters?!@#^**^&()"
b
Removing intermediate container 9a98e726e145
 ---> 9f9276112bf0
Successfully built 9f9276112bf0

我需要稍后做一些文件操作,所以我使用 sed

取决于要完成的操作 - 在模板案例中,envsubst 就足够了。

在使用变量之前,我需要为 sed 转义路径字符 \。

是的 - 或者使用不同的 s 分隔符 - s!something!somethingelse!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 2021-05-24
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2014-11-19
    相关资源
    最近更新 更多