docker - 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
解决方案
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
推荐阅读
- c# - 在序列化/反序列化时识别 dataFile 的类型
- razor - 来自剃刀页面的 Blazor Server .NET 5 身份验证
- ios - UIDocumentInteractionController:无法使用/保存文件
- asp.net-mvc - LINQ to Entities 不支持指定的类型成员“SubArea”
- oracle-apex - 从计算中绑定标签 - oracle apex
- javascript - 将此数组中的数字替换为 %
- arrays - 使用C中的数组打印二维二叉树
- python - pip 可以在指定的本地目录中安装第一个搜索轮然后再安装 pypi 吗?
- r - 用新变量对不同时期进行分组
- api - 带有 curl 的 LinkedIn API?