如何转义 dockerfile 中的 $ 符号?

mmo*_*mmo 4 docker

我正在尝试编写一个 dockerfile,在其中向名为 envvars 的脚本添加一些 java 选项。为了实现这一点,我想在所述文件中附加一些文本行,如下所示:

RUN echo "JAVA_OPTS=$JAVA_OPTS -Djavax.net.ssl.trustStore=${CERT_DIR}/${HOSTNAME}_truststore.jks" >> ${BIN_DIR}/envvars
RUN echo "JAVA_OPTS=$JAVA_OPTS -Djavax.net.ssl.trustStorePassword=${PWD_TRUSTSTORE}" >> ${BIN_DIR}/envvars
RUN echo "export JAVA_OPTS" >> ${BIN_DIR}/envvars
Run Code Online (Sandbox Code Playgroud)

这里的问题是,我想要杂项。占位符 ${varname} (那些带有大括号的)在执行 docker build 命令期间被替换,而子字符串 '$JAVA_OPTS' (即那些没有大括号的)应该被回显,从而逐字添加到 envvars 文件中,即最后文件中的结果/usr/local/apache2/bin/envvars应为:

...
JAVA_OPTS=$JAVA_OPTS -Djavax.net.ssl.trustStore=/usr/local/apache2/cert/myserver_truststore.jks
JAVA_OPTS=$JAVA_OPTS -Djavax.net.ssl.trustStorePassword=my_secret
export JAVA_OPTS
Run Code Online (Sandbox Code Playgroud)

如何从 dockerfile 中的变量替换中转义 $ 符号?我找到了使用 \$ 或 $$ 的提示,但两者都不适合我。

如果这很重要(我希望/预计不会):我正在 Windows 10 上使用“Docker Desktop”构建映像,但我希望 dockerfile 对此不可知。

Lin*_*nPy 5

首先,您需要将 # escape=` 添加到您的 Dockerfile 中,因为\它是 Dockerfile 中的转义字符。那么你可以使用来转义该部分\$中的美元符号RUN

例子:

# escape=`
RUN echo "JAVA_OPTS=\$JAVA_OPTS -Djavax.net.ssl.trustStore=${CERT_DIR}/${HOSTNAME}_truststore.jks" >> ${BIN_DIR}/envvars 
Run Code Online (Sandbox Code Playgroud)

这将JAVA_OPTS=$JAVA_OPTS在你的 env 文件中