gpt4 book ai didi

bash - 没有连续重启就无法从脚本工作中获取任何Docker Entrypoint

转载 作者:行者123 更新时间:2023-12-02 19:02:58 26 4
gpt4 key购买 nike

我在理解或看到将bash脚本用作Docker容器的切入点时遇到问题。我已经尝试了很多东西了大约5个小时。

即使从此official Docker blog,使用bash脚本作为入口点仍然不起作用。

Docker文件

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"]

docker-entrypoint.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 "$@"

build.sh
docker build -t test .

运行
docker service create \
--name test \
test

尽管付出了很多努力,但我似乎无法使用Entrypoint作为bash脚本来获取Dockerfile,而该bash脚本不会不断重启并反复失败。

我的理解是 exec "$@"假定是让容器表单立即退出,但是我不确定这是否取决于脚本中其他失败的过程。

我尝试使用一个 docker-entrypoint.sh脚本,它看起来像这样:
#!/bin/bash

exec "$@"

而且由于那也失败了,所以我认为可以排除脚本内部出现其他错误的原因。

同样令人沮丧的是,没有来自 docker service logs testdocker logs [container_id]的日志,而且我似乎在 docker inspect [container_id]中找不到有用的东西。

我很难理解每个人对 exec "$@"的信心。我不想诉诸于 tail -f /dev/null之类的东西,也不想诉诸 docker run的命令。我希望能够以某种一致,可靠的方式可靠地使用 docker-entrypoint.sh脚本来启动我可以与 docker run一起运行的服务以及其他服务内容,但即使在Docker的官方博客以及此处无数问题和来自其他博客的情况下,网站,我似乎无法获得一个例子。

对于我在这里缺少的内容,我将不胜感激。

最佳答案

$ @只是命令行参数的字符串。您没有提供任何内容,因此它正在执行一个空字符串。那将退出并且将杀死 docker 。但是,exec命令将始终退出正在运行的脚本-它会破坏当前的shell并启动一个新的shell,但它不会保持运行。

我认为您想要做的是继续以递归方式调用此脚本。要实际具有脚本调用本身,该行应为:

exec $0

$ 0是bash文件的名称(如果在函数中,则为函数名称)。在这种情况下,它就是脚本的名称。

另外,我很好奇您希望不使用tail -f / dev / null吗?一遍又一遍地创建新的shell的性能并不高。我猜您想让此脚本反复运行以仅检查您的if条件。

在这种情况下,while(1)循环可能会起作用。

关于bash - 没有连续重启就无法从脚本工作中获取任何Docker Entrypoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57422328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com