我正在尝试使用docker-compose来调出一个容器。作为 ENTRYPOINT ,该容器有一个我写的简单bash脚本。现在,当我尝试以下列任何一种方式调出容器时:
docker-compose up
docker-compose up foo
它没有完成。即,尝试将(docker exec -i -t $1 /bin/bash
)附加到正在运行的容器,失败并显示:
来自守护程序的错误响应:容器xyz正在重新启动,等待容器运行。
我尝试过将命令放在后台。那没用。
my-script.sh
cmd1 &
cmd2 &&
...
cmdn &
在使用和不使用entrypoint: /bin/sh /usr/local/bin/my-script.sh
选项的情况下,我还尝试使用和不使用tty: true
和 ii) i)。没有骰子。
搬运工-compose.yml
version: '2'
services:
foo:
build:
context: .
dockerfile: Dockerfile.foo
...
tty: true
entrypoint: /bin/sh /usr/local/bin/my-script.sh
还尝试了一个手动泊坞窗构建/运行周期。并且(不在 ENTRYPOINT 中启动/bin/sh
)运行就会退出。
$ docker build ... .
$ docker run -it ...
... shell echos commands here, then exits
$
我确定它很简单。这里的解决方案是什么?
答案 0 :(得分:3)
entrypoint
中的docker-compose.yml
只需要
entrypoint: /usr/local/bin/my-script.sh
只需将#! /bin/sh
添加到脚本顶部即可指定要使用的shell。
您还需要将exec "$@"
添加到入口点脚本的底部,否则它将立即退出,这将终止容器。
答案 1 :(得分:2)
首先,你需要放置一些无限的东西来继续在后台运行你的容器,就像你可以tail -f application.log
或类似这样的东西,这样即使你从你的容器bash退出它仍然在后台运行
您不需要cmd1 & cmd2 &&...cmdn &
只需将touch 1.txt && tail -f 1.txt
这样的命令作为my-script.sh
的最后一步。它将继续运行您的容器。
还有一件事需要改变,docker run -it -d
-d
将以背景模式启动容器。如果你想进入容器而不是docker exec -it container_name/id bash
调试问题并退出。它仍会保留你的容器运行直到你停在docker stop container_id/name
希望这有帮助。
谢谢!