Docker-compose入口点脚本停止出口为0的容器

时间:2019-03-15 00:34:31

标签: ruby-on-rails docker docker-compose docker-entrypoint

在执行我的入口点脚本之后,容器将从出口0停止。在启动Web服务器的撰写文件中指定的命令将被忽略。

我们将docker-docker和docker-compose用作Rails应用程序的环境。

入口点脚本:

#! /bin/bash
bundle exec rails assets:clobber
bundle exec rails assets:precompile

bundle exec rake db:exists && bundle exec rake db:migrate || bundle exec rake db:setup

rm -rf /aps/tmp/pids/server.pid

撰写文件:

version: '2'
services:
  app:
    image: registry.gitlab.com/.../.../master:latest
    command: bundle exec rails server
    entrypoint: /aps/rails-entrypoint.sh
    volumes:
      - /srv/app/log/:/app/log
      - /srv/app/public/:/app/public
    env_file: .env
    ports:
      - '0.0.0.0:3333:3000'
    links:
      - apppostgres

  apppostgres:
    image: postgres
    ...


volumes:
  pgdata:

在入口点脚本运行时连接到容器时,我可以看到以ps aux的{​​{1}}身份运行的命令。

当我将命令块添加到入口点脚本时,服务器已启动并正在运行,但这也不是应该如何工作的?

如何使入口点脚本和命令块按原样运行?

2 个答案:

答案 0 :(得分:1)

启动容器时,启动容器的过程(在您的情况下为entrypoint.sh)将被视为pid 1,只要该过程正在运行,则容器将保持运行并运行死机或由于某种原因而停止,它将以退出状态0或更高的状态停止容器,取决于主进程的实际退出状态。

您需要在入口点的末尾添加以下内容,以使其与bundle exec rails server一起使用

exec "$@"

答案 1 :(得分:1)

  

执行我的入口点脚本后,容器停止

这几乎是定义性的:当入口点完成时,容器退出。

  

在启动Web服务器的撰写文件中指定的命令将被忽略。

将其作为命令行参数传递给入口点,并且脚本将自行决定是否对其进行适当的操作。

最常见的做法是执行未经修改的命令行参数:

#!/bin/sh
# ... do pre-launch setup ...
exec "$@"

({ENTRYPOINTCMD不能单独组合以使您可以在容器中按顺序运行两件事:仅运行 入口点,将命令获取为参数,容器的生存期恰好是入口点的生存期。)