Django docker映像仅启动python shell

时间:2019-10-11 06:28:34

标签: django docker docker-compose

我有以下docker-compose文件

version: '3'

services:
  web:
    build: .
    command: bash -c "python manage.py collectstatic --no-input && gunicorn -w 2 --bind 0.0.0.0:8000 api.wsgi:application"
    volumes:
      - .:/code
      - static_volume:/code/api/static
    expose:
      - 8000
    environment:
      - DJANGO_SETTINGS_MODULE=api.settings.production
    depends_on: 
      - redis
  redis:
    image: "redis:alpine"
  celery:
    build: .
    command: celery -A api worker -l warning
    volumes:
      - .:/code
    environment:
      - DJANGO_SETTINGS_MODULE=api.settings.production
    depends_on:
      - redis
  nginx:
    build: ./nginx
    ports:
      - 80:80
    volumes:
      - static_volume:/code/api/static
    depends_on:
      - web

volumes:
  static_volume:

我将使用以下命令来构建docker映像并将其推送到我们的gitlab docker注册表中:

docker build -t foo/api-django .
docker push foo/api-django

这没有问题。但是,一旦我拉出图像并使用以下命令运行它

docker run -p 8000:80 -i -t foo/api-django

它仅显示图像的python shell: docker image just shows python shell

有什么建议吗?当我刚运行docker-compose时,它通常会启动nginx,gunicorn等。

编辑:这是我的新dockerfile,看来可以正常工作。但是现在,当我使用docker ps

时,只有gunicorn开始使用
FROM python:3
ENV PYTHONUNBUFFERED 1
ENV C_FORCE_ROOT true
ENV DJANGO_SETTINGS_MODULE api.settings.production
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
CMD [ "python", "manage.py", "collectstatic", "--no-input" ]
CMD [ "gunicorn", "-w", "2", "--bind", "0.0.0.0:8000", "api.wsgi:application" ]

1 个答案:

答案 0 :(得分:1)

这里的命令将不起作用,因为您要执行的命令(python manage.py collectstatic --no-input && gunicorn -w 2 --bind 0.0.0.0:8000 api.wsgi:application)位于docker-compose文件中。

您应该通过docker compose运行它。使用

docker-compose -f docker-compose.yml build  # `docker-compose up` will work if your yml file is named `docker-compose.yml`

制作图像

并使用以下命令运行这些容器:

docker-compose -f docker-compose.yml up

您可以使用docker-compose -f docker-compose.yml up -d作为守护程序模式运行它。

或者,您可以将此命令放入Dockerfile内,并将其删除以撰写文件:

FROM python:3
ENV PYTHONUNBUFFERED 1
ENV C_FORCE_ROOT true
# rest of the code

CMD python manage.py collectstatic --no-input; gunicorn -w 2 --bind 0.0.0.0:8000 api.wsgi:application

这时,您应该可以使用docker run运行docker。这仅用于运行web容器。它不会运行其余的容器。如果您在Dockerfile内更新CMD,请确保将其从command的{​​{1}}部分中删除。