Dockerfile 使用使用 Shell Command 构建的变量



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

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

像这样:

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

Dockerfile:

FROM ubuntu:${VER}

或者我把它从 dockerfile 中遗漏并使用

docker-compose:

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中的一行或两行,则会出现错误:

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

ARG是你的朋友。

  • Dockerfile ARG
  • Docker compose args

Dockerfile

ARG VER=latest
FROM ubuntu:${VER}

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

docker-compose.yml

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

我们将映像构建参数VER替换为环境变量VERSION

使用 shell env 变量启动容器

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

最新更新