首页 > 解决方案 > 用作选项值的 Bash 进程替换

问题描述

我正在尝试运行

docker-compose --env-file <(cat file1.env <(echo -e "\n\n") file2.env) config

docker-compose预计--env-file是一个文件。我需要使用(连接)两个文件。

跑步docker-compose --env-file file_any.env config效果很好。

单独运行cat file1.env <(echo -e "\n\n") file2.env输出有效结果。

但它不知何故不适用于docker-compose.

我究竟做错了什么?

标签: bashdocker-composeprocess-substitution

解决方案


您不需要额外的流程替换。外部进程替换捕获它包装的所有命令的标准输出,因此您不限于单个cat命令。

docker-compose --env-file <( cat file1.env; printf '\n\n'; cat file2.env) config

不幸docker-compose的是,要求参数--env-file是真实文件。参数的值直接传递给Environment.from_env_file,它通过以下方式进行显式检查env_vars_from_file

def env_vars_from_file(filename, interpolate=True):
    """
    Read in a line delimited file of environment variables.
    """
    if not os.path.exists(filename):
        raise EnvFileNotFound("Couldn't find env file: {}".format(filename))
    elif not os.path.isfile(filename):
        raise EnvFileNotFound("{} is not a file.".format(filename))
    ...

推荐阅读