在 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 命令实例
- 将 标准输入(
stdin
)中的环境变量替换到标准输出(stdout
) :
$ echo '$HOME' | envsubst
- 替换输入文件中的环境变量,并将其输出到标准输出:
$ envsubst < path/to/input_file
- 替换输入文件中的环境变量并输出到文件:
$ envsubst < path/to/input_file > path/to/output_file
- 用空格分隔的列表替换输入文件中的环境变量:
$ envsubst '$USER $SHELL $HOME' < path/to/input_file
参考: