作为环境文件传递给Docker运行命令时,$ cat文件命令不起作用

问题描述

我有一个很大的文件,需要将它作为环境变量传递给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的环境部分,这些特定的变量将从外壳传递到容器。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...