问题描述
我有一个很大的文件,需要将它作为环境变量传递给linux ec2平台中的Docker run命令。
我理想的docker命令如下:
docker run -p 6080:9000 -e KAFKA_broKERCONNECT=url:port -e KAFKA_TRUSTSTORE="$(cat directory/kafka.client.truststore.jks | base64)" -e KAFKA_KEYSTORE="$(cat directory/kafka.client.keystore.jks | base64)" -e KAFKA_PROPERTIES="$(cat directory/kafka.properties | base64)" -e SERVER_SERVLET_contextpath="/" -d obsidiandynamics/kafdrop
我得到/ bin / docker:参数列表太长
因此,我没有执行上述操作,而是从文件中传递了所有Env变量 kafdrop-properties文件如下所示:
KAFKA_broKERCONNECT=host:port
KAFKA_TRUSTSTORE="$(cat 2kafka.client.truststore.jks)"
KAFKA_KEYSTORE="$(cat 2kafka.client.keystore.jks)"
KAFKA_PROPERTIES="$(cat /home/de601928/kafka/kafka.properties | base64)
和相应的Docker运行命令:
docker run -p 6080:9000 --env-file kafdrop-properties -d obsidiandynamics/kafdrop
现在,在我运行命令之后,我仍然看到环境变量(如KAFKA_TRUSTSTORE)没有通过cat内容读取,并在我运行docker exec env时按原样显示
为什么cat命令不会从文件中读取文件并将其值作为环境变量参数传递。
我尝试了不同的方式,例如给“
解决方法
之所以发生这种情况,是因为docker使用简化的机制来解析.env文件,如here所述。仅在直接引用变量时才解析变量,并且不支持命令。
编辑:
使用docker-compose这样的东西应该可以工作:
您的docker-compose.yml
文件
version: '3'
services:
my-service:
image: obsidiandynamics/kafdrop
environment:
- KAFKA_BROKERCONNECT
- KAFKA_TRUSTSTORE
- KAFKA_KEYSTORE
- KAFKA_PROPERTIES
ports:
- 6080:9000
然后运行
eval $(egrep -v '^#' .env | xargs) && docker-compose up
应该发生的是,命令的第一部分将解析文件并设置变量,然后在评估这些变量的同时运行docker-compose命令。
现在,通过像上面一样设置docker-compose.yml的环境部分,这些特定的变量将从外壳传递到容器。