【问题标题】:How do I check whether an environment variable is set in a docker container?如何检查 docker 容器中是否设置了环境变量?
【发布时间】:2019-11-13 22:07:54
【问题描述】:

我正在尝试使用 docker 为每个节点 kafka 集群设置一个单一代理。这个想法是多个 docker 容器每个都包含一个代理,我将有另一个 docker 容器作为 zookeeper 节点。我正在构建一个图像,我可以将 zookeeper 地址和代理 ID 作为环境变量传递,这些变量将用于启动代理。当我从映像启动容器时,只需将它们作为环境变量传递,这对于调出具有不同代理 ID 的多个节点很有用。

这是我的 dockerfile:

FROM openjdk:8

RUN mkdir /kafka
WORKDIR /kafka

COPY kafka_2.12-2.3.0 kafka_2.12-2.3.0

COPY cmd.sh cmd.sh

RUN cat /etc/os-release
RUN chmod +x ./cmd.sh

CMD ["./cmd.sh"]

EXPOSE 9092

这是我的 cmd.sh

#!/bin/sh

export KAFKA_DIR=/kafka/kafka_2.12-2.3.0

if [[ -z $KAFKA_BROKER_ID || -z $KAFKA_ZOOKEEPER_ADDRESS ]]; then
  echo 'Zookeeper address and broker id need to be set by env variables KAFKA_ZOOKEEPER_ADDRESS and KAFKA_BROKER_ID'
  exit 1
fi

echo "Broker ID: ${KAFKA_BROKER_ID}"
echo "Zookeeper addresss: ${KAFKA_ZOOKEEPER_ADDRESS}"

"${KAFKA_DIR}"/bin/kafka-server-start.sh "${KAFKA_DIR}"/config/server.properties --override broker.id="${KAFKA_BROKER_ID}" --override zookeeper.connect="${KAFKA_ZOOKEEPER_ADDRESS}"

我从问题How to check if multiple variables are defined or not in bash得到这个

我希望看到错误消息,但结果却是:

./cmd.sh: 5: ./cmd.sh: [[: not found ./cmd.sh: 5: ./cmd.sh: -z: not
found Broker ID: Zookeeper addresss: [2019-07-03 08:56:04,172] INFO
Registered kafka:type=kafka.Log4jController MBean
(kafka.utils.Log4jControllerRegistration$) [2019-07-03 08:56:04,752]
ERROR Exiting Kafka due to fatal exception (kafka.Kafka$)
org.apache.kafka.common.config.ConfigException: Invalid value  for
configuration broker.id: Not a number of type INT

【问题讨论】:

  • if [ -z "$KAFKA_ZOOKEEPER_ADDRESS" ] || [ -z "$KAFKA_BROKER_ID" ]; then...您使用的是 bash 语法,但不是 bash。
  • 您是否考虑过扩展现有的 docker 镜像,例如hub.docker.com/r/confluentinc 的那些人?
  • @RobinMoffatt 我有一些空闲时间,我想我会通过这种方式了解更多信息。

标签: bash docker apache-kafka


【解决方案1】:

if ( -z "$KAFKA_ZOOKEEPER_ADDRESS" || -z "$KAFKA_BROKER_ID" ) 不适用于语法无效的 bash:

你应该使用:

if [ -z "$KAFKA_ZOOKEEPER_ADDRESS" || -z "$KAFKA_BROKER_ID" ]; then

并将您的 shebang 更改为 #!/bin/bash

【讨论】:

  • 我编辑了问题和输出以反映原始答案中的语法。括号是我自己的想法,之后它也不起作用
  • 在尝试之后我得到了这个: docker run -p 9092:9092 localhost:5000/openjdk-kafka-broker Broker ID: Zookeeper 地址:./cmd.sh: 5: [: missing ] 。 /cmd.sh: 5: ./cmd.sh: -z: 未找到
  • if [ -z "$KAFKA_ZOOKEEPER_ADDRESS" || -z "$KAFKA_BROKER_ID" ]; then 也不起作用。它说./cmd.sh: 5: [: missing ] ./cmd.sh: 5: ./cmd.sh: -z: not found
猜你喜欢
  • 2015-07-14
  • 2015-06-23
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多