Docker 的世界里,很多人喜欢或想制作一些基础镜像分享,为了能够让其灵活多用,通常会对一些配置文件进行模板化,然后提供环境变量为他人使用提供可自定义的便利。但是很多人都不知道如何替换模板中的环境变量为实际值,当搜索相关工具时,基本都会提到 envsubst,然而当试图使用该命令或安装它的时候,会得到一个找不到该命令的提示,因为这个命令在 gettext 的命令包里。

很多人喜欢用 Alpine Linux 作为 Docker 基础镜像,由于 Alpine 立足于最轻量级的 Linux 发行版,很多命令都没有被默认安装。envsubst 命令的被安装的频率是非常之高,但是它没有独立的包,只能安装整个 gettext, 其它的命令被用到的机会又很少,这有悖 Alpine Linux 的性格。终于有人提议将 envsubst 分离出来,并得到了支持,在 Alpine Linux 3.18 之后可用。

envsubst

envsubst 是一个用于替换 shell 字符串或脚本中的环境变量的工具。在没有选项的默认情况下使用时,将 stdin 复制到 stdout,用适当的环境变量值替换任何环境变量字符串,例如 $VARIABLE${VARIABLE}。像 “我的编辑器是 $EDITOR” 将被转换为“我的编辑器是 /usr/bin/emacs”。指定 shell 格式限制了对 shell 格式中引用的那些变量的替换。

envsubst 命令行参数

envsubst 命令只有很少的选项,如下所示:

选项 描述
-h, –help 打印帮助信息,然后退出。
-v, –variables 显示 shell 格式中引用的变量,然后退出。
-V, –version 打印版本信息,然后退出。

如果在运行 envsubst 命令时出现如下所示的错误:

envsubst: command not found

可以尝试根据你选择的发行版安装 gettext 包。

发行版 命令
OS X brew install gettext
Debian apt-get install gettext-base
Ubuntu apt-get install gettext-base
Alpine apk add gettext
Alpine 3.18+ apk add envsubst
Arch Linux pacman -S gettext
Kali Linux apt-get install gettext-base
CentOS yum install gettext
Fedora dnf install gettext
Raspbian apt-get install gettext-base

envsubst 命令实例

  1. 将 标准输入(stdin)中的环境变量替换到标准输出(stdout) :
$ echo '$HOME' | envsubst
  1. 替换输入文件中的环境变量,并将其输出到标准输出:
$ envsubst < path/to/input_file
  1. 替换输入文件中的环境变量并输出到文件:
$ envsubst < path/to/input_file > path/to/output_file
  1. 用空格分隔的列表替换输入文件中的环境变量:
$ envsubst '$USER $SHELL $HOME' < path/to/input_file

参考:

envsubst: command not found

[Package request] envsubst