【问题标题】:Docker-compose entrypoint script stops container with exit 0Docker-compose 入口点脚本通过出口 0 停止容器
【发布时间】:2019-03-15 00:34:30
【问题描述】:

在我的入口点脚本执行后,容器在 Exit 0 处停止。在启动我们的网络服务器的 compose 文件中指定的命令被忽略。

我们使用 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 作为/bin/bash /app/rails-entrypoint.sh bundle exec rails server 运行的执行命令。

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

如何让入口点脚本和命令块正常运行?

【问题讨论】:

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


    【解决方案1】:

    当您启动容器时,启动容器的进程 - 在您的情况下为 entrypoint.sh - 将被视为 pid 1,因此只要此进程正在运行,您的容器就会保持启动并运行,如果它死亡或停止无论出于何种原因,它都会停止退出状态为0 或更高级别的容器,这取决于主进程的实际退出状态。

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

    exec "$@"
    

    【讨论】:

    • 谢谢。我以为我对入口点脚本做了一些小修改,但我不小心删除了。
    【解决方案2】:

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

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

    在启动我们的网络服务器的 compose 文件中指定的命令被忽略。

    它作为命令行参数传递给入口点,由你的脚本来做任何合适的事情。

    最常见的做法是不加修改地执行命令行参数:

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

    (ENTRYPOINTCMD 不要单独组合,让您在容器中按顺序运行两件事:运行入口点,获取命令作为参数,然后容器的生命周期正是入口点的生命周期。)

    【讨论】:

      猜你喜欢
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 2016-10-08
      相关资源
      最近更新 更多