我有基于cookiecutter-django的django Web应用程序。堆栈是基于运行的几个容器构建的:django,redis,celerybeat,celery worker,celery flower,postgres,caddy。当我在VPS上的类似于生产的环境中启动应用程序时,我遇到了奇怪的行为-django似乎正在运行旧版本的代码(例如,使用表单版本),尽管已从git存储库中签出了新代码。我尝试了一些操作来“强制”刷新应用程序代码:
docker-compose down
,然后依次用docker-compose build
和docker-compose up
与上述类似的重建,但仅适用于具有django的容器。
当我检查Django容器内的代码时-有正确版本的代码。
我使用Django Debug Toolbar
做了一个核对应用程序-似乎没有从缓存中加载页面(没有从后端调用缓存,并且对数据库的查询数量很多,这可能表明页面没有从缓存中加载) 。
我期望django将自动检测代码更改并重新启动运行新代码,此外还可能需要重新启动解释器(应通过放下容器并重新构建来解决)。还有其他需要检查或尝试的想法吗?删除所有容器,图像和卷很有帮助,但这不是介绍每个更新的首选方法。
我经历了Why does docker-compose build not reflect my django code changes?和After docker-compose build the docker-compose up run old not updated containers
的解决方案,但除了“ nuke all”之外,没有其他对我有用。有没有办法进行“软装”?
这是django容器的Dockerfile:
# Dockerfile for django container
FROM python:3.6-alpine
ENV PYTHONUNBUFFERED 1
RUN apk update \
# psycopg2 dependencies
&& apk add --virtual build-deps gcc python3-dev musl-dev \
&& apk add postgresql-dev \
# Pillow dependencies
&& apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev \
# CFFI dependencies
&& apk add libffi-dev py-cffi
RUN addgroup -S django \
&& adduser -S -G django django
# Requirements are installed here to ensure they will be cached.
COPY ./requirements /requirements
RUN pip install --no-cache-dir -r /requirements/production.txt \
&& rm -rf /requirements
COPY ./compose/production/django/entrypoint /entrypoint
RUN sed -i 's/\r//' /entrypoint
RUN chmod +x /entrypoint
RUN chown django /entrypoint
COPY ./compose/production/django/start /start
RUN sed -i 's/\r//' /start
RUN chmod +x /start
RUN chown django /start
COPY ./compose/production/django/celery/worker/start /start-celeryworker
RUN sed -i 's/\r//' /start-celeryworker
RUN chmod +x /start-celeryworker
RUN chown django /start-celeryworker
COPY ./compose/production/django/celery/beat/start /start-celerybeat
RUN sed -i 's/\r//' /start-celerybeat
RUN chmod +x /start-celerybeat
RUN chown django /start-celerybeat
COPY ./compose/production/django/celery/flower/start /start-flower
RUN sed -i 's/\r//' /start-flower
RUN chmod +x /start-flower
COPY . /app
RUN chown -R django /app
USER django
WORKDIR /app
ENTRYPOINT ["/entrypoint"]
答案 0 :(得分:0)
万一有人碰到这个问题,答案是每次推送新代码时都必须重建容器。
只要跑步
docker-compose -f production.yml build
更新生产版本