我无法理解或看到使用 bash 脚本作为 Docker 容器的入口点的某些工作版本。我已经尝试了很多东西了大约 5 个小时。
即使来自这个官方 Docker 博客,使用 bash 脚本作为入口点仍然不起作用。
Dockerfile
FROM debian:stretch
COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s /usr/local/bin/docker-entrypoint.sh / # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["postgres"]
码头入口点.sh
#!/bin/bash
set -e
if [ "$1" = 'postgres' ]; then
chown -R postgres "$PGDATA"
if [ -z "$(ls -A "$PGDATA")" ]; then
gosu postgres initdb
fi
exec gosu postgres "$@"
fi
exec "$@"
构建.sh
docker build -t test .
运行.sh
docker service create \
--name test \
test
尽管付出了很多努力,但我似乎无法使用入口点作为 bash 脚本来获取 Dockerfile,该脚本不会不断重启并反复失败。
我的理解是exec "$@"
假设保持容器表单立即退出,但我不确定这是否依赖于脚本中的其他进程失败。
我试过使用一个docker-entrypoint.sh
看起来像这样的脚本:
#!/bin/bash
exec "$@"
而且由于这也失败了,我认为这排除了脚本内部出现的其他问题是导致失败的原因。
同样令人沮丧的是,没有来自docker service logs test
或的日志docker logs [container_id]
,而且我似乎在docker inspect [container_id]
.
我很难理解每个人对exec "$@"
. 我不想诉诸于使用类似的东西tail -f /dev/null
或使用命令 at docker run
。我希望有一些一致、可靠的方式,docker-entrypoint.sh
脚本可以可靠地用于启动服务,我也可以使用这些服务来运行docker run
其他服务,但即使在 Docker 的官方博客和这里的无数问题以及来自其他站点的博客上,我似乎无法找到一个可以工作的例子。
我真的很感激能深入了解我在这里所缺少的东西。