Nginx Gunicorn与docker:如何使用多个dockerfile

时间:2018-11-22 11:11:05

标签: django docker nginx docker-compose gunicorn

我正在使用以下example来构建django-postgres-nginx-gunicorn Web服务器。我希望每个容器都有单独的文件夹。项目的以下结构正常工作。主Dockerfile用于hello应用程序(django项目):

svm3_03
|____Dockerfile
|____config
|    |____gunicorn
|    |    |____conf.py
|    |____nginx
|    |    |____conf.d
|    |         |____local.conf
|    |____db
|         |____db_env
|____docker
|    |__db
|       |__Dockerfile
|       |__dataForDB
|__docker-compose.yml
|__hello

docker-compose.yml看起来像这样:

version: '3'
...
services:
   djangoapp:
      build:
         context: .
...

并且Dockerfile具有以下行:

CMD ["gunicorn", "-c", "config/gunicorn/conf.py", "--bind", ":8000", "--chdir", "hello", "hello.wsgi:application"]

一切正常。现在我尝试为django应用程序提供与DB映像相同的结构,因此我将主Dockerfile和hello目录移至docker文件夹内...我在docker文件夹内创建了一个名为djangoapp的新文件夹,并将其移至了该目录Dockerfile和hello文件夹。新的结构如下:

svm3_03
|____config
|    |____gunicorn
|    |    |____conf.py
|    |____nginx
|    |    |____conf.d
|    |         |____local.conf
|    |____db
|         |____db_env
|____docker
|    |__db
|    |  |__Dockerfile
|    |  |__dataForDB
|    |__djangoapp
|       |__Dockerfile
|       |__hello
|__docker-compose.yml

然后我要做的就是像这样更改docker-compose.yml文件中的上下文行:

version: '3'
...
services:
   djangoapp:
      build:
         context: ./docker/djangoapp
...

现在出现以下错误:

djangoapp_1_7b3c77a4b939 | Error: can't chdir to 'hello'...

这是由于djangoapp Dockerfile中的gunicorn和命令行CMD所致。显然在docker-compose.yml中更改上下文是不够的...知道我缺少什么吗?

谢谢

更新: 这是完整的dockerfile:

FROM python:2

ENV PYTHONUNBUFFERED 1
RUN mkdir -p /opt/services/djangoapp/src

WORKDIR /opt/services/djangoapp/src

COPY . /opt/services/djangoapp/src
RUN pip install --no-cache-dir -r hello/requirements.txt
RUN cd hello && python manage.py collectstatic --no-input

EXPOSE 8000
CMD ["gunicorn", "-c", "config/gunicorn/conf.py", "--bind", ":8000", "--chdir", "hello", "hello.wsgi:application"]

2 个答案:

答案 0 :(得分:0)

我认为问题不在于/hello,而在于config/,似乎没有被复制到容器内。要进行验证,请exec -it进入容器,然后ls

您需要在其中传递该文件夹,一种解决方案是使用音量:

服务:    djangoapp:       体积:       -./config:/opt/services/djangoapp/src

另一种解决方案是将其复制到映像中,您将需要更改构建上下文,否则docker会抱怨从上下文外部复制文件

services:
   djangoapp:
      build:
         context: .
         dockerfile: ./docker/djangoapp/Dockerfile

并更改Dockerfile中的路径以使其相对于新上下文

COPY ./docker/djangoapp /opt/services/djangoapp/src

答案 1 :(得分:0)

最后,我能够找到问题所在。我的错误是在Django应用程序的Dockerfile中。运行gunicorn的命令必须指向正确的目录。这是正确的命令:

CMD ["gunicorn", "-c", "config/gunicorn/conf.py", "--bind", ":8000", "--chdir", "docker/djangoapp/hello", "hello.wsgi:application"]

请注意--chdir选项的参数。