【问题标题】:Setting flask app with uwsgi and nginx in docker container在 docker 容器中使用 uwsgi 和 nginx 设置烧瓶应用程序
【发布时间】:2018-02-12 11:01:39
【问题描述】:

我正在尝试在 docker 容器中运行带有 flask、uwsgi 和 nginx 的 Docker 容器。

我的 Dockerfile 看起来是这样的:

FROM ubuntu:16.04

MAINTAINER Dockerfiles

# Install required packages and remove the apt packages cache when done.
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y \
    ...
    
# install uwsgi 
RUN pip3 install uwsgi

# copy over requirements.txt file
COPY requirements.txt /home/docker/code/

# upgrade pip and install required python packages
RUN pip3 --no-cache-dir install -U pip
RUN pip3 --no-cache-dir install -r /home/docker/code/requirements.txt

# add (the rest of) our code
COPY ./app /home/docker/code/

# create a systemd unit file
COPY ./app.service /etc/systemd/system/  # Think the problem is here

# start the uwsgi service
RUN systemctl start app  # This is not working
RUN systemctl enable app

# setup all the configfiles
COPY nginx_app /etc/nginx/sites-available/

# enable nginx server block
RUN ln -s /etc/nginx/sites-available/nginx_app /etc/nginx/sites-enabled

# validate syntax
CMD ["nginx", "-t"]

# restart nginx
RUN systemctl restart nginx

# allow nginx
RUN ufw allow 'Nginx Full'

然后是我的 app.service:

[Unit]
Description=uWSGI instance to serve app
After=network.target

[Service]
User=docker
Group=www-data
WorkingDirectory=/home/docker/code
ExecStart=/usr/local/bin/uwsgi --ini uwsgi.ini

[Install]
WantedBy=multi-user.target

nginx 配置

server {
    listen 80;
    server_name my_server_ip;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/docker/code/myproject.sock;
    }

然后是我的 uwsgi.ini

[uwsgi]
module = wsgi:app

master = true
processes = 5

socket = app.sock
chmod-socket = 664
vacuum = true

die-on-term = true

但是当我尝试构建它时,我得到了这个错误

第 12 步:运行 systemctl start app

--->在79a22c2629db中运行

连接总线失败:没有这样的文件或目录

INFO[0022] 命令 [/bin/sh -c systemctl start app] 返回非零代码:1

我正在阅读,我认为问题出在 systemd 上。我应该使用supervisord。但我不知道该怎么做。

在“普通”服务器上,我可以运行这些命令并且它会工作,但在 docker 容器中无法工作。

我遇到的“唯一”问题是我必须使用 uwsgi 和 nginx 运行我的应用程序,但我不明白。

我在 Internet 上阅读了许多帖子和教程,也尝试更改 this project,但它仍然无法正常工作,我更喜欢使用我的 dockerfile(这个),因为这是我所理解的。

【问题讨论】:

  • 在 Docker 容器中将应用程序作为 systemd 服务运行没有任何意义。你为什么这样做?
  • 我想用 supervisord 运行它,但我不知道该怎么做。我是 docker 容器的新手,我知道的唯一方法是使用 systemd。

标签: python docker nginx flask uwsgi


【解决方案1】:

我找到了答案。

我用 supervisord 解决了这个问题。

# install uwsgi now because it takes a little while
RUN pip3 install uwsgi

# setup all the configfiles
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
COPY nginx_app.conf /etc/nginx/sites-available/default
COPY supervisor_app.conf /etc/supervisor/conf.d/


# copy over our requirements.txt file
COPY requirements.txt /home/docker/code/

# upgrade pip and install required python packages
RUN pip3 --no-cache-dir install -U pip
RUN pip3 --no-cache-dir install -r /home/docker/code/requirements.txt

# add (the rest of) our code
COPY ./app /home/docker/code/

EXPOSE 80
CMD ["supervisord"]

然后 supervisor_app.conf 看起来像这样

[supervisord]
nodaemon=true

[program:uwsgi]
command = /usr/local/bin/uwsgi --ini /home/docker/code/uwsgi.ini
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:nginx]
command = /usr/sbin/nginx
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

uwsg.ini

[uwsgi]
callable = app
chdir = /home/docker/code/
wsgi-file = /home/docker/code/wsgi.py
socket = /home/docker/code/app.sock
master = true
processes = 2
chmod-socket = 666
enable-threads = true

还有我的 nginx_app.conf

server {
    listen 80 default_server;
    server_name my_ip;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    location / {
        include uwsgi_params;
        uwsgi_pass unix:///home/docker/code/app.sock;
    }
}

就是这样

【讨论】:

  • 嘿,我正在尝试遵循这些相同的配置文件,但代码文件夹名称在所有地方都不同。步骤 8/21:运行 echo "daemon off;" >> /etc/nginx/nginx.conf ---> Running in 876f489fc21c /bin/sh: 1: cannot create /etc/nginx/nginx.conf: Directory nonexistent 在构建映像时出现此错误。你能帮我吗?谢谢
【解决方案2】:

您也可以使用docker-systemctl-replacement,它专门用于允许在 docker 容器中使用与在真正的 systemd 控制机器上相同的 systemctl 命令。当它作为 CMD 运行时,它将启动所有已启用的服务。

【讨论】:

    猜你喜欢
    • 2012-11-28
    • 2013-09-01
    • 2017-11-16
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2015-09-18
    相关资源
    最近更新 更多