【发布时间】:2023-03-09 11:57:02
【问题描述】:
我有一个需要设置环境变量才能运行的容器映像。但是如果使用-d 运行,除非容器被监控,否则运行容器的人不会注意到缺少某些东西。有没有办法让docker [container] run 在启动容器之前检查是否为容器提供了环境变量。
【问题讨论】:
标签: docker environment-variables dockerfile
我有一个需要设置环境变量才能运行的容器映像。但是如果使用-d 运行,除非容器被监控,否则运行容器的人不会注意到缺少某些东西。有没有办法让docker [container] run 在启动容器之前检查是否为容器提供了环境变量。
【问题讨论】:
标签: docker environment-variables dockerfile
在分离模式下,使用-d 运行时,无法打印需要 env 的消息,但您可以尝试解决方法:
Dockerfile
FROM alpine
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
入口点.sh
#!/bin/sh
echo "starting container $hostname"
if [ -z "$REQUIRED_ENV" ]; then
echo "Container failed to start, pls pass -e REQUIRED_ENV=sometest"
exit 1
fi
echo "starting container with $REQUIRED_ENV"
#your long-running command from CMD
exec "$@"
所以当你运行时
docker run -it --name envtest --rm env-test-image
它会随着消息退出
starting container
Container failed to start, pls pass -e REQUIRED_ENV=sometest
分离模式的解决方法
docker run -it --name envtest -d --rm env-test-image && docker logs envtest
【讨论】:
否:目前没有办法让 Docker 以环境变量的形式感知“依赖”。此答案适用于那些真正来到这里的人,他们只是在寻找一种规范的方式来在缺少值的情况下退出入口点脚本。
POSIX shell 采用选项 -u(扩展未设置变量时出错)和 -e(当任何语句返回错误/非零退出时退出 shell代码)。我们还有 : 来评估但不调用一个表达式。将这些放在一起,我们应该能够创建一个entrypoint.sh,它可以不受 sh 实现的影响,如下所示:
#!/bin/sh -e -u
( : $USERNAME )
( : $PASSWORD )
exec "$@"
这将退出脚本并出现类似于PASSWORD: parameter not set 的错误。
做同样事情的另一种方法,但在带有自定义错误消息的原始示例的上下文中,可以使用“Display Error if Null or Unset”运算符 (${parm:?error})看起来像这样:
#!/bin/sh
echo "starting container $hostname"
( : ${REQUIRED_ENV?"pls pass -e REQUIRED_ENV=sometest"} ) || exit 1
echo "starting container with $REQUIRED_ENV"
#your long-running command from CMD
exec "$@"
【讨论】: