【问题标题】:Default value with shell expressions in Dockerfile ARG and ENVDockerfile ARG 和 ENV 中带有 shell 表达式的默认值
【发布时间】:2017-09-04 07:13:02
【问题描述】:

我想接收版本号作为单个参数,并在 Dockerfile 中的 RUN 脚本中提取 URL 中各个位置的主要/次要数字。

ARG CUDA_VERSION
ARG CUDNN_VERSION

ENV CUDA_FULL="${CUDA_VERSION:-8.0.61_375.26}" \
    CUDA_MAJOR="$(echo ${CUDA_VERSION:-8.0.61_375.26} | cut -d. -f1)" \
    CUDA_MINOR="$(echo ${CUDA_VERSION:-8.0.61_375.26} | cut -d. -f2)" \
    CUDA_MAJMIN="$CUDA_MAJOR.$CUDA_MINOR"
ENV CUDNN_FULL="${CUDNN_VERSION:-7.0.1}" \
    CUDNN_MAJOR="$(echo ${CUDNN_VERSION:-7.0.1} | cut -d. -f1)" \
    CUDNN_MINOR="$(echo ${CUDNN_VERSION:-7.0.1} | cut -d. -f2)" \
    CUDNN_MAJMIN="$CUDNN_MAJOR.$CUDNN_MINOR"

RUN curl -LO https://.../${CUDNN_FULL}/.../...${CUDA_MAJMIN}...

如果我尝试上述方法,shell 表达式不会被评估,而是按原样粘贴到后面的 RUN 脚本中。

是否有更好的方法来实现这一点,而无需创建包装此 Dockerfile 的外部 shell 脚本?

【问题讨论】:

  • 我不敢相信仍然没有优雅的解决方案来解决这个问题。

标签: shell docker dockerfile


【解决方案1】:

来自文档:

${variable_name} 语法还支持一些标准 bash 修饰符,如下所示:

${variable:-word} 表示如果设置了变量,那么结果就是那个值。如果未设置变量,则结果为 word。

${variable:+word} 表示如果设置了变量则返回word,否则返回空字符串。

ENV 是特殊的 docker build 命令,不支持。您正在寻找的是在 ENV 中运行 Shell 命令。所以这行不通。

可能的解决方案是使用 bash 脚本

cuda_version.sh

#!/bin/bash
CUDA_FULL="${CUDA_VERSION:-8.0.61_375.26}"
CUDA_MAJOR="$(echo ${CUDA_VERSION:-8.0.61_375.26} | cut -d. -f1)"
CUDA_MINOR="$(echo ${CUDA_VERSION:-8.0.61_375.26} | cut -d. -f2)"
CUDA_MAJMIN="$CUDA_MAJOR.$CUDA_MINOR" 
CUDNN_FULL="${CUDNN_VERSION:-7.0.1}"
CUDNN_MAJOR="$(echo ${CUDNN_VERSION:-7.0.1} | cut -d. -f1)"
CUDNN_MINOR="$(echo ${CUDNN_VERSION:-7.0.1} | cut -d. -f2)"
CUDNN_MAJMIN="$CUDNN_MAJOR.$CUDNN_MINOR"

并将您的 dockerfile 更改为

ARG CUDA_VERSION=8.0.61_375.26
ARG CUDNN_VERSION=7.0.1

ENV CUDA_VERSION=${CUDA_VERSION} CUDNN_VERSION=${CUDNN_VERSION}
COPY cuda_version.sh /cuda_version.sh
RUN bash -c "source /cuda_version.sh && curl -LO https://.../${CUDNN_FULL}/.../...${CUDA_MAJMIN}..."

您可以从 shell 文件中删除默认值,因为它们将始终存在于 Dockerfile 参数/环境中

【讨论】:

    猜你喜欢
    • 2019-04-22
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    相关资源
    最近更新 更多