我有一个在 Docker 容器中运行的 Django 项目。在本地,当我更新项目以包含对模型的更改时,我已在 docker 容器中运行
python manage.py makemigrations
和 python manage.py migrate
。特别是,我将从终端进入容器并运行 python manage.py makemigrations
和 python manage.py migrate
来执行更改。这在本地有效。但是,现在由于某种原因我已将代码推送到生产环境 (AWS ECS),manage.py
未运行来更新现有数据库。没有证据表明 manage.py
正在日志中运行,即使它在我的 entrypoint.sh
脚本中。我是否需要在 Dajngo 项目或 AWS ECS 中设置任何其他配置才能在 AWS ECS 环境中运行迁移?该项目运行良好,因此 docker 容器已启动,只是 python manage.py migrate
从未运行。
我已包含以下
Dockerfile
供参考:
FROM python:3.11-slim-bookworm
ENV uid=1000
ENV gid=1000
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV TZ=UTC
ENV USER=app_user UID=$uid GID=$gid
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update \
&& apt-get install -y --no-install-recommends tzdata libpcre3 libpython3-dev libpcre3-dev python3-pip build-essential libpq-dev \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /app
COPY Makefile pyproject.toml poetry.lock /tmp/
RUN pip install poetry
RUN poetry config virtualenvs.create false
WORKDIR /tmp
RUN make requirements.txt
RUN pip install --no-cache-dir -r requirements.txt \
&& rm -rf requirements.txt \
&& groupadd -f --gid "${GID}" "${USER}" \
&& useradd ${USER} --uid ${UID} --gid ${GID} \
&& install -d -m 0755 -o ${USER} -g ${USER} /app/static
RUN apt-get purge -y libpython3-dev python3-pip build-essential libpq-dev libpcre3-dev \
&& apt-get clean
RUN rm -rf /tmp/*
COPY book_store /app
COPY entrypoint.sh /app/entrypoint.sh
COPY post-deployment.sh /app/post-deployment.sh
WORKDIR /app
ENTRYPOINT ["./entrypoint.sh"]
我已包含以下
entrypoint.sh
供参考:
./manage.py wait_for_database
./manage.py migrate
./manage.py createsuperuser --noinput || true
./manage.py collectstatic --noinput
exec uwsgi --ini uwsgi.ini
如有任何帮助,我们将不胜感激!
这可能是权限问题。您可能需要确保在 docker 容器中运行 django 应用程序的用户有权运行迁移命令..
也许尝试通过将应用程序目录的所有者设置为指定用户来明确。尝试在 dockerfile 中的 mkdir 命令下方或任何合适的位置添加以下内容。
RUN mkdir -p /app
# Set ownership for the /app directory
RUN groupadd -f --gid "${GID}" "${USER}" \
&& useradd ${USER} --uid ${UID} --gid ${GID} \
&& chown -R ${USER}:${USER} /app