【问题标题】:how to run server using docker container?如何使用 docker 容器运行服务器?
【发布时间】:2018-12-28 04:50:05
【问题描述】:

Django 服务器在 localhost 中运行良好。但是,当我尝试在 docker 容器上运行服务器时,使用 docker-compose 文件时找不到 manage.py 文件,即使我手动运行容器并运行服务器,它也不会出现在浏览器中。我怎么解决这个问题?

所以我在本地服务器上编写了所有代码测试并使用 dockerfile 构建了我的项目的映像。

我尝试在 docker 容器上运行服务器,但突然无法运行。 更糟糕的是,如果我使用 docker-compose 运行服务器,虽然我已经使用 'docker run -it $image_name sh' 进行了检查,但它找不到 manage.py 文件

这是我项目的代码

我是 docker 新手,也是编程新手。 希望你能给我帮助。谢谢!

文件结构

current directory
└─example
└─db.sqlite3
└─docker-compose.yml
└─Dockerfile
└─manage.py
└─Pipfile
└─Pipfile.lock 

Docker 文件

# Base image - Python version
FROM python:3.6-alpine

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Set work directory
WORKDIR /code

# Copy Pipfile
COPY Pipfile /code
COPY Pipfile.lock /code

# Install dependencies
RUN pip install pipenv
RUN pipenv install --system

# Copy files
COPY . /code/

docker-compose.yml

# docker-compose.yml
version: '3.3'

services:
  web:
    build: .
    command: python /code/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - 8000:8000

预期结果:在 web 浏览器中运行服务器,如在 chrome 中

实际结果:

  • 使用 docker-compose 时: 提示中出现这样的错误:web_1 | python: 无法打开文件'/code/manage.py': [Errno 2] 没有这样的文件或目录

  • 在 shell 上使用 'docker run -it $image_name sh' 和 'python manage.py runserver' 手动运行容器时: 服务器正在运行,但未连接到 Web 浏览器。 (不会出现在像chrome这样的浏览器中'

【问题讨论】:

  • 我怀疑您的 /code 是一个文件。您应该首先创建/code 文件夹,然后在复制到文件夹时以斜杠结束目标。
  • 使用docker run 手动运行时,服务器不会显示在浏览器中,因为您没有EXPOSEed 端口。
  • 为什么不将你的命令改为“bash”而不是“manage.py runserver”并尝试手动运行它......或者至少检查/code中的内容
  • 只需添加-p 8000:8000 即可在docker run 命令中公开端口。出于不相关的原因,您还需要--rm,以免大量废弃实例污染您的库存。

标签: python python-3.x docker docker-compose dockerfile


【解决方案1】:

你在很多方面都做过同样的事情。您已使用 COPY 命令复制源文件,然后在 docker-compose.yml 文件中安装了主机卷。首先,您不需要卷,因为卷挂载用于持久化 Docker 容器生成和使用的数据。

遵循简化的 Dockerfile 和 docker-compose 文件将解决问题。

# Base image - Python version
FROM python:3.6-alpine

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Copy files
COPY . /code/

# Set work directory
WORKDIR /code

# Install dependencies
RUN pip install pipenv
RUN pipenv install --system

docker-compose.yml -:

# docker-compose.yml
version: '3.3'

services:
  web:
    build: .
    command: python ./manage.py runserver 0.0.0.0:8000
    ports:
      - 8000:8000

【讨论】:

  • 他可能根本不需要设置workdir,因为他明确地调用了manage.py的路径......但实际上他不应该使用manage.py runserver来实际服务任何实际长度时间(即使在 docker 容器内)...而是在 nginx 或 apache 后面提供它...我发现 runserver 在使用几天后变得无响应
  • 是的,如果您使用的是绝对路径,则没有必要。但在这种情况下,/code 内不会有任何内容。正如@JoranBeasley 所说,删除 WORKDIR /code 会起作用
  • 是的,因为他是怎么做的......我认为如果他根本不使用 workdir,它会正确地将他的 cwd 安装到 /code ......我认为至少(+1 虽然因为这个对我来说似乎是个问题……但我没有 docker pro :P)
  • 第一段是假的。 WORKDIR 根本不影响 COPY 命令;它在容器内使用绝对路径,因此它们独立于任何WORKDIR。此外,根据引用的文档,WORKDIR 将具有创建目录的理想副作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 2020-06-18
  • 2018-10-23
  • 2018-06-01
  • 2017-03-04
  • 2020-04-03
相关资源
最近更新 更多