Python 如何使用docker容器运行服务器?

Python 如何使用docker容器运行服务器?,python,python-3.x,docker,docker-compose,dockerfile,Python,Python 3.x,Docker,Docker Compose,Dockerfile,Django服务器在本地主机中运行良好。但是,当我尝试在docker容器上运行服务器时,它在使用docker compose文件时找不到manage.py文件,即使我手动运行容器并运行服务器,它也不会出现在浏览器中。我怎样才能解决这个问题 因此,我在本地服务器上编写了所有代码测试,并使用dockerfile构建了项目的映像 我试着在docker容器上运行服务器,但突然它不运行了。 更糟糕的是,如果我使用docker compose运行服务器,它找不到manage.py文件,尽管我已经用“dock

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

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

我试着在docker容器上运行服务器,但突然它不运行了。 更糟糕的是,如果我使用docker compose运行服务器,它找不到manage.py文件,尽管我已经用“docker run-it$image\u name sh”进行了检查

这是我的项目代码

我对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那样出现在浏览器中)


您在许多方面都做了相同的事情。您使用
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

我怀疑您的
/code
是一个文件。您应该先创建
/code
文件夹,然后在复制到文件夹时以斜杠结束目标。当使用
docker run
手动运行时,服务器不会显示在浏览器中,因为您尚未
公开该端口。为什么不将命令更改为“bash”而不是“manage.py runserver”然后尝试手动运行它…或者至少检查/code中的内容只需添加
-p8000:8000
即可在
docker run
命令中公开端口。出于不相关的原因,您还需要
--rm
,以避免大量废弃实例污染您的库存。他可能根本不需要设置workdir,因为他很明确tly调用manage.py的路径…但实际上,他不应该使用manage.py runserver实际服务任何实际时间长度(甚至在docker容器中)…而是在nginx或apache之后提供它…我发现runserver在使用数天之后变得没有响应是的,如果您使用的是绝对路径,那么它就没有必要了。但是在这种情况下,/code中不会有任何内容。正如@JoranBeasley所说的,删除WORKDIR/代码会起作用是的,因为他是这样做的。我想如果他根本不使用workdir,它将正确地将他的cwd装载到/code…我认为至少(+1),因为这对我来说可能是个问题…但我不是docker pro:P)第一段是假的。
WORKDIR
根本不影响
COPY
命令;它在容器中使用绝对路径,因此它们独立于任何
WORKDIR
。此外,根据引用的文档,
WORKDIR
将产生创建目录的理想副作用。