【问题标题】:$cat file command is not working when passing as a environment file to Docker run command当作为环境文件传递给 Docker 运行命令时,$cat 文件命令不起作用
【发布时间】:2021-02-16 08:47:06
【问题描述】:

我有一个非常大的文件,需要作为环境变量传递给 linux ec2 平台中的 Docker 运行命令。

我理想的 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 命令没有从文件中读取并将值作为环境变量参数传递。

我尝试了不同的方式,比如提供 "

【问题讨论】:

  • export那些变量了吗?另外 - cat directory/kafka.client.truststore.jks | base64 等生成的字符串是什么样的?对于 base64,它们不应包含空格,这使得错误消息难以理解...

标签: linux docker file cat docker-run


【解决方案1】:

这是因为 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 的环境部分,这些特定的变量将从 shell 传递到容器。

【讨论】:

  • 感谢@Milan 提供的信息。在那种情况下,我无法将环境变量传递给 docker 吗?还有其他解决方法吗?
  • 一种解决方法可能是先用 bash 预处理 env 文件,但我不确定如何使用 run 命令传递它们。如果您可以使用 docker-compose,那么您将能够直接从 shell 传递它们,因为 docker-compose.yml 文件可以将环境变量从 shell 传递到容器。如果你喜欢我可以给你写一个例子
  • 当然。会试一试。但问题是,这是我从hub.docker.com/r/obsidiandynamics/kafdrop 中提到的 repo 中提取的 docker 映像,并且没有使用 docker compose 传递这些环境变量而不更改源代码的示例。
猜你喜欢
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 2015-04-14
  • 2021-01-03
  • 1970-01-01
  • 2014-05-26
  • 2013-10-27
  • 1970-01-01
相关资源
最近更新 更多