替换dockerfile变量中的字符-错误:替换中缺少':'

问题描述 投票:0回答:1

在我的docker文件中,我为版本号定义了一个带点的变量,我想用下划线代替点以作进一步使用。

ARG ABC_VERSION=1.2.3
ARG SOME_OTHER_VARIABLE=/dir_name/abc_${ABC_VERSION//./_}

不幸的是,我收到以下错误。

failed to process "/dir_name/abc_${ABC_VERSION//./_}": missing ':' in substitution

我多次在dockerfile中需要多次使用'。'。一次使用“ _”,我不喜欢定义两个变量。

有人知道如何解决此问题吗?

docker dockerfile
1个回答
0
投票

${parameter/pattern/string}语法实际上是Bash功能(请参阅shell parameter expansion),而不是POSIX功能。

根据the official documentation,Dockerfile指令仅支持:

$var
${var}
${var:-word} → if var is not set then word is the result;
${var:+word} → if var is set then word is the result, otherwise the empty string

因此问题没有“直接”解决方案,但是如果最终要在某些shell命令中使用您要替换的变量(在RUNENTRYPOINTCMD指令中),那么您可以将初始值保持不变(不替换),然后稍后替换呢?

例如,以下是Dockerfile:

FROM debian

ARG ABC_VERSION=1.2.3
ENV SOME_OTHER_VARIABLE=/app/${ABC_VERSION}

WORKDIR /app

RUN /bin/bash -c 'touch "${SOME_OTHER_VARIABLE//./_}"'

# RUN touch "${SOME_OTHER_VARIABLE//./_}"
# would raise /bin/sh: 1: Bad substitution

CMD ["/bin/bash", "-c", "ls -hal \"${SOME_OTHER_VARIABLE//./_}\""]

顺便说一句:

  • 为了能够从ARG SOME_OTHER_VARIABLE使用它,我用ENV SOME_OTHER_VARIABLE替换了CMD。>>
  • [应该记得,ENTRYPOINTCMD指令应该以exec形式-CMD ["…", "…"]-而不是以shell形式编写(例如,参见问题:CMD doesn't run after ENTRYPOINT in Dockerfile)。
  • 或者作为替代解决方法,您可能希望将版本号分为主要,次要,补丁,以编写类似的内容?

ARG MAJOR=1
ARG MINOR=2
ARG PATCH=3
ARG ABC_VERSION=$MAJOR.$MINOR.$PATCH
ARG SOME_OTHER_VARIABLE=/dir_name/abc_${MAJOR}_${MINOR}_${PATCH}
…
© www.soinside.com 2019 - 2024. All rights reserved.