我拍摄了 Kafka UI 镜像(provectuslabs/kafka-ui:v0.7.1): https://hub.docker.com/layers/provectuslabs/kafka-ui/master/images/sha256-633606ca07677d1c4b9405c5df1b6f0087aa75b36528a17eed142d06f65d0881?context=explore
我想在启动 Kafka UI 之前执行脚本。
我不想将秘密存储在 docker compose 文件中,所以我使用 docker swarm 秘密。它们存储在/run/secrets/... 这些秘密存储在 docker 文件中,因此我使用 sh 脚本将它们转换为环境变量。 代码链接:https://github.com/swarm-pack/swarm-sync/blob/master/env_secrets_expand.sh
#!/bin/bash
env_secret_expand() {
var="$1"
eval val=\$$var
if secret_name=$(expr match "$val" "DOCKER-SECRET->\([^}]\+\)$"); then
secret="${ENV_SECRETS_DIR}/${secret_name}"
env_secret_debug "Secret file for $var: $secret"
if [ -f "$secret" ]; then
val=$(cat "${secret}")
export "$var"="$val"
env_secret_debug "Expanded variable: $var=$val"
else
env_secret_debug "Secret file does not exist! $secret"
fi
fi
}
env_secrets_expand() {
for env_var in $(printenv | cut -f1 -d"=")
do
env_secret_expand $env_var
done
}
env_secrets_expand
为了能够执行 bash 脚本,我将以下行添加到 docker 文件中:
FROM provectuslabs/kafka-ui:v0.7.1
# Secret for swarm
USER root
COPY env_secrets_expand_ui.sh /env_secrets_expand_ui.sh
RUN chmod +x /env_secrets_expand_ui.sh
RUN apk add --no-cache bash
EXPOSE 8080
CMD /env_secrets_expand_ui.sh && java --add-opens java.rmi/javax.rmi.ssl=ALL-UNNAMED -jar kafka-ui-api.jar
在日志中,我看到 bash 脚本正在运行,但 kafka-ui 忽略这些变量,而是使用 docker compose 中指定的模板:
SPRING_SECURITY_USER_NAME: DOCKER-SECRET->kafka_ui_user
SPRING_SECURITY_USER_PASSWORD: DOCKER-SECRET->kafka_ui_password
链接到上一个问题:如何将我的脚本嵌入到图像 kafka-ui
如何从 docker swarm 设置 kafka-ui 的环境变量?
这按预期工作。您在脚本中导出的环境变量不会被持久化,因为它们不是通过 dockerfile 中的“ENV”指令设置的。
这里的一个解决方案是通过 docker compose 本身使用秘密:source。