Dockerfile 使用使用 Shell 命令构建的变量

标签 docker docker-compose dockerfile

为了更清楚地说明目标,让我们用一个更好的例子,比如我想要一个可移植 .env该文件收集主机 IP 地址,然后在 build 中使用该地址过程。 .env文件应该在每次构建时动态生成变量,这样如果主机 IP 发生变化,构建就会调整。

我正在尝试使用我的主机操作系统版本作为 docker-compose 调用的 dockerfile 的构建变量。我也尝试将图像行注入(inject) 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 撰写:
image: ubuntu:${VER}
build: .

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

更新:我尝试了以下但继续收到错误。
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是你的 friend 。

  • 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}
    

    我们替换图像构建 arg VER带环境变量 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
    

    关于Dockerfile 使用使用 Shell 命令构建的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61947779/

    相关文章:

    node.js - 在 Docker 构建中找不到 TSC

    mysql - 使用 docker-compose 连接 Tomcat 容器和 Mysql 容器

    c# - 带有 Visual Studio 的 Docker 卷

    angularjs - 如何创建 AngularJS 应用程序的 Docker 容器?

    docker - 在Docker容器中安装Docker => D-Bus连接错误

    node.js - 为以下应用程序结构编写 docker 的正确方法是什么?

    docker - 从容器 ssh 到远程主机,无需 openssh-client 设置

    postgresql - Docker volume 不持久化数据

    docker - 为什么我无法访问 docker-compose 创建的服务?

    java - 了解gradle.properties和java-opts