使用自定义shell脚本作为docker入口点

时间:2017-03-21 08:43:37

标签: docker docker-compose devops

我正在尝试使用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
$

我确定它很简单。这里的解决方案是什么?

2 个答案:

答案 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 希望这有帮助。 谢谢!