Docker Compose中服务command能否使用environment块定义的环境变量?
Docker Compose环境变量在command中生效的问题
问题原因
你遇到的情况是因为Docker Compose会优先解析宿主机的shell变量,而非容器内的环境变量:
$HOME能正常输出,是因为它是宿主机已存在的环境变量,Compose解析后把值传给了容器;$VAR1没被识别,是因为宿主机没有这个变量,Compose解析后变成空字符串,容器自然输出空。
解决方法
要让environment块定义的变量在command中生效,需要阻止Compose提前解析变量,让容器内的shell来处理变量解析,有三种常用方式:
用单引号包裹整个command
单引号会让Compose直接把命令原封不动传给容器的shell,容器启动后会读取自身环境变量里的VAR1:version: '3.7' services: appserver: image: **** command: 'echo $VAR1 && echo $HOME' environment: - VAR1=XXXX转义变量符号
$
在$VAR1前加反斜杠\,告诉Compose不要解析这个变量,容器shell会处理它:version: '3.7' services: appserver: image: **** command: "echo \$VAR1 && echo $HOME" environment: - VAR1=XXXX使用数组形式的command
数组形式会跳过Compose的shell解析,直接把命令参数传给容器的shell执行,需要指定/bin/sh -c来处理变量逻辑:version: '3.7' services: appserver: image: **** command: ["/bin/sh", "-c", "echo $VAR1 && echo $HOME"] environment: - VAR1=XXXX
以上三种方式都能让容器内的VAR1正常输出XXXX。
内容的提问来源于stack exchange,提问作者klautern
相关产品推荐
相关产品推荐

