使用 ENTRYPOINT 或 CMD 时,Gunicorn 不会在 docker 容器中运行

8oh*_*oh8 1 flask gunicorn docker

我有以下 Dockerfile 和 Entrypoint.sh 脚本。我按如下操作,但是当我运行容器时,看起来gunicorn永远不会启动,因为没有任何内容写入日志文件。容器仍在运行,因为我输入“docker ps”并且可以看到它。

然后,我通过执行“docker exec -it /bin/bash”启动 bash 进程,我可以从那里运行 Gunicorn 进程,然后它就可以工作了。

所以基本上,如果我运行容器,然后登录到 bash 会话并粘贴 Gunicorn 命令,它就可以工作,但否则就不起作用。

Dockerfile:

FROM ubuntu:18.04
MAINTAINER peter griffin "some@email.com"
RUN apt-get update -y && apt-get install -y python-pip python-dev

WORKDIR /deploy

COPY ./requirements.txt ./
RUN pip install -r requirements.txt
RUN pip install gunicorn

COPY ./app ./app

COPY [\
    "run.py", \
    "app.db", \
    "entrypoint.sh", \
    "config.py", \
    "gunicorn.conf.py", \
    "./"]

#RUN mkdir ./logs
RUN chmod +x ./entrypoint.sh

ENTRYPOINT ["sh", "entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

入口点.sh:

#!/bin/bash

mkdir -p /deploy/logs
touch /deploy/logs/error.log
touch /deploy/logs/access.log
tail -n 0 -f /deploy/logs/*.log

exec gunicorn run:app \
    --name greg_docker \
    --bind 0.0.0.0:8080 \
    --workers 2 \
    --log-level=info \
    --log-file=/deploy/logs/error.log \
    --access-logfile=/deploy/logs/access.log \
Run Code Online (Sandbox Code Playgroud)

构建:

docker build -t greg:latest .
Run Code Online (Sandbox Code Playgroud)

跑步:

docker run -d -p 8080:8080 greg:latest
Run Code Online (Sandbox Code Playgroud)

如果我在 /bin/bash 会话中的容器内,我可以粘贴:

exec gunicorn run:app \
    --name greg_docker \
    --bind 0.0.0.0:8080 \
    --workers 2 \
    --log-level=info \
    --log-file=/deploy/logs/error.log \
    --access-logfile=/deploy/logs/access.log
Run Code Online (Sandbox Code Playgroud)

然后当我在 docker 主机上访问http://0.0.0.0:8080时它就可以工作了。

有什么不同?为什么gunicorn在entrypoint.sh上不起作用?

更新 我创建了一个新文件,entrypoint2.sh:

#!/bin/bash
mkdir -p /deploy/logs
touch /deploy/logs/error.log
exec gunicorn run:app \
    --name greg_docker \
    --bind 0.0.0.0:8080 \
    --log-level=debug \
    --log-file=/deploy/logs/error.log \
    --workers 2
"$@"
Run Code Online (Sandbox Code Playgroud)

我已经用以下行更新了我的 Dockerfile:

ENTRYPOINT ["sh","-x","entrypoint2.sh"]
Run Code Online (Sandbox Code Playgroud)

当我运行容器时,我得到以下信息:

+ mkdir -p /deploy/logs
+ touch /deploy/logs/error.log
+ exec gunicorn run:app --name greg_docker --bind 0.0.0.0:8080 --log-level=debug --log-file=/deploy/logs/error.log --workers 2
Run Code Online (Sandbox Code Playgroud)

但随后容器不会执行任何操作,它不会保持运行状态。

8oh*_*oh8 5

事实证明,运行gunicorn 时,您绝对需要指定一个配置文件。

入口点2.sh:

#!/bin/bash
mkdir -p /deploy/logs
touch /deploy/logs/error.log
touch /deploy/logs/access.log
cd /deploy
exec gunicorn --bind 0.0.0.0:8080 -c docker-gunicorn.conf.py run:app
Run Code Online (Sandbox Code Playgroud)

docker-gunicorn.conf.py:

accesslog = "/deploy/logs/access.log"
errorlog = "/deploy/logs/error.log"
Run Code Online (Sandbox Code Playgroud)