【问题标题】:Container exited with code 0 when run from docker-compose从 docker-compose 运行时,容器以代码 0 退出
【发布时间】:2020-08-24 20:54:57
【问题描述】:

我正在尝试从 docker 文件运行容器。

**docker-compose.yml**
    services:
        djangoapp:
            build: .
            volumes:
              - .:/opt/services/djangoapp/src
            ports:
              - 8000:8000

**Dockerfile** this is entry in Docker file
    ENTRYPOINT bash start.sh
**start.sh**
    #!/bin/bash
    ## run gunicorn in background......
    gunicorn --chdir hello --bind :8000  hello_django.wsgi:application &

当我从同一个 Dockerfile 构建映像时,它工作正常。 当我从 docker-compose up 启动时,它显示 exited with code 0我想知道我的 docker 退出的原因(Exited (0) 18 seconds ago) ??

【问题讨论】:

  • 你能在问题中更新你的 Dockerfile 吗?
  • 同时使用docker-compose logs djangoapp检查日志

标签: python django bash docker docker-compose


【解决方案1】:

您的start.sh 脚本会启动一些后台进程,然后到达终点并退出(成功,因此状态码为 0)。当start.sh 脚本退出时,由于它是容器的ENTRYPOINT,容器以相同的状态码退出。

需要有某个进程作为前台进程运行,并且只要该进程存在,容器就会一直运行。在您的情况下,这是 GUnicorn 进程,您可以在 Dockerfile 中将其指定为图像的 CMD

CMD gunicorn --chdir hello --bind :8000 hello_django.wsgi:application

如果您的start.sh 脚本中唯一的东西正在运行该行,您可以删除ENTRYPOINT 行。如果不是,请将其更改为运行 exec "$@" 作为最后一行(运行 CMD),并将 Dockerfile ENTRYPOINT 行更改为 JSON-array 语法:

RUN chmod +x start.sh
ENTRYPOINT ["./start.sh"]
CMD gunicorn --chdir hello --bind :8000 hello_django.wsgi:application
#!/bin/sh
# ... do other pre-launch setup ...
# Run the CMD
exec "$@"

(我会避免在容器启动脚本中运行后台进程:没有任何东西会监视或重新启动这些进程,并且您可能会处于容器运行一半的状态,或者您不必要地需要重新启动某些东西的状态,因为其他人有更新。如果您需要运行多个进程,请尝试将它们安排在单独的容器中运行;如果您只需要一个,请将其作为前台进程运行。)

【讨论】:

  • 如果您认为这是因为后台进程完成并退出,那么对于正常的 docker build & run 应该是一样的,不是吗?根据问题,正常的 docker run 可以按预期工作,但只有通过 compose 完成才会导致此结果。有什么想法吗?
  • 后台进程无关:成功到脚本结束,脚本退出,容器退出。我不确定为什么 Compose 设置与其他设置会有所不同;如果volumes: 覆盖入口点脚本,您可能正在运行不同的代码。
猜你喜欢
  • 2019-12-27
  • 2017-04-07
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多