从 docker-compose 运行时,容器退出并显示代码 0

ami*_*dav 4 python django bash docker docker-compose

我正在尝试从 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 &
Run Code Online (Sandbox Code Playgroud)

当我从同一个Dockerfile构建图像时,它工作正常。当我从 docker-compose up 启动时,它显示已退出,代码为 0。 我想知道我的 docker 退出的原因(18 秒前退出(0))?

Dav*_*aze 5

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

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

CMD gunicorn --chdir hello --bind :8000 hello_django.wsgi:application
Run Code Online (Sandbox Code Playgroud)

如果脚本中唯一的事情start.sh就是运行该行,则可以删除该ENTRYPOINT行。如果没有,请将其更改exec "$@"为最后一行运行(以运行CMD),并将 DockerfileENTRYPOINT行更改为 JSON 数组语法:

CMD gunicorn --chdir hello --bind :8000 hello_django.wsgi:application
Run Code Online (Sandbox Code Playgroud)
RUN chmod +x start.sh
ENTRYPOINT ["./start.sh"]
CMD gunicorn --chdir hello --bind :8000 hello_django.wsgi:application
Run Code Online (Sandbox Code Playgroud)

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