2017-09-04 163 views
0

我想將版本號作爲單個參數接收,並在Dockerfile的RUN腳本中爲URL中的各個位置提取主要/次要編號。Dockerfile中的shell表達式的缺省值ARG和ENV

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腳本?

回答

1

從文檔:

的$ {變量名}語法還支持幾個標準的bash改性劑的規定如下:

$ {變量:-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參數/環境中

+0

感謝您回答並參考文檔。我已經按照你的建議寫了一個封裝外殼腳本。 – Achimnol