首页 > 解决方案 > Dockerfile 使用使用 Shell 命令构建的变量

问题描述

为了更清楚地说明目标,让我们用一个更好的例子,假设我想要一个可移植的.env文件,它收集主机 IP 地址,然后在build进程中使用它。该.env文件应在每次构建时动态生成变量,以便如果主机 IP 更改,构建将进行调整。

我正在尝试使用我的主机操作系统版本作为 docker-compose 调用的 dockerfile 的构建变量。我也尝试将图像行注入 docker-compose 无济于事。

像这样的东西:

cat .env
VER="$(cat /etc/lsb-release | grep -o 'DISTRIB_RELEASE.*' |  cut -f2- -d=)"
#VER=18.04

Dockerfile:

FROM ubuntu:${VER}

或者我将其从 dockerfile 中删除并使用

码头工人撰写:

image: ubuntu:${VER}
build: .

但是我收到一个关于没有构建过程的错误,不确定它是否可以这样工作。知道如何将由工具构建的变量注入到这样的 docker 文件中吗?(和/或 Docker-Compose 用于未来的项目)。

更新:我尝试了以下但继续收到错误。

cat docker-compose.yaml
version: '3.7'

services:
 fileserver:
    container_name: ${CONTAINER_NAME}
    hostname: ${CONTAINER_NAME}
    privileged: true
    build:
      context: .
      args:
        VER: ${VERSION}

……

cat .env
#VERSION="$(cat /etc/lsb-release | grep -o 'DISTRIB_RELEASE.*' |  cut -f2- -d=)"
VERSION="$(cat /etc/lsb-release | grep -o 'DISTRIB_CODENAME.*' |  cut -f2- -d=)"

…………

cat Dockerfile
#ARG VER
#FROM ubuntu:${VER}
FROM ubuntu:bionic

…………

Dockerfile如果我在using 变量中取消注释任何一行或两行,我会收到错误:

Step 1/5 : FROM ubuntu:${VER} ERROR: Service 'ubuntu' failed to build: invalid reference format

标签: dockerdocker-composedockerfile

解决方案


ARG是你的朋友。

Dockerfile

ARG VER=latest
FROM ubuntu:${VER}

上面的 dockerfile 定义了一个名为 的构建参数VER,默认为latest.

码头工人-compose.yml

version: '3'
services:
  demo:
    image: enix223/demo
    build:
      context: .
      args:
        VER: ${VERSION}

VER我们用环境变量替换图像构建 arg VERSION

使用 shell 环境变量启动容器

VERSION="$(cat /etc/lsb-release | grep -o 'DISTRIB_RELEASE.*' |  cut -f2- -d=)" docker-compose up -d

.env使用文件启动容器

cat > .env << EOF
VERSION="$(cat /etc/lsb-release | grep -o 'DISTRIB_RELEASE.*' |  cut -f2- -d=)"
EOF

docker-compose up -d

推荐阅读