如何在docker-compose.yml中传递多行无键名环境变量
问题根因
你出现报错的核心原因是混淆了Docker命令的参数位置:
- 原
docker run命令中,单引号包裹的多行Logstash配置是跟在镜像名之后的容器进程启动参数,其中的-e是Logstash程序自身接收的「直接传入配置字符串」的命令行参数,根本不是Docker的-e/--env环境变量参数 - Docker命令的参数顺序规则是:
docker run [Docker自身参数] 镜像名 [传给容器内主进程的参数],镜像名之后的所有内容都不会被Docker识别为自身参数
你错误地将这段配置放在了environment块下,而Compose的environment块要求每一项必须符合变量名=变量值的格式,解析时会把第一个空格前的内容识别为变量名,自然触发「变量名不能包含空白字符」的报错。
正确docker-compose.yml配置
version: '3' services: logstash-producer: image: opensearchproject/logstash-oss-with-opensearch-output-plugin:7.16.2 container_name: logstash-producer stdin_open: true # 对应原命令-it参数中的-i:保持标准输入打开 tty: true # 对应原命令-it参数中的-t:分配伪终端 networks: - test # 对应原命令的--net test参数 command: > -e 'input { stdin { } } output { opensearch { hosts => ["https://opensearch:9200"] index => "opensearch-logstash-docker-%{+YYYY.MM.dd}" user => "admin" password => "admin" ssl => true ssl_certificate_verification => false } }' networks: test: external: true # 标记test网络为预先创建的外部网络,和原命令行为一致
补充说明
- 原命令的
--rm(容器退出后自动删除)参数无法直接在Compose服务配置中声明,启动时使用docker-compose run --rm logstash-producer命令即可实现相同效果 - 配置中使用YAML的
>折叠语法处理多行内容,会自动将换行转为空格,避免Logstash配置解析错误 - 如果你后续需要修改Logstash配置,直接修改
command下的配置块即可,不需要调整其他配置项
内容的提问来源于stack exchange,提问作者Tahir Mustafa
相关产品推荐
相关产品推荐

