Django Manage.py 从 Google 托管 VM Dockerfile 迁移 - 如何?
Django Manage.py Migrate from Google Managed VM Dockerfile - How?
我正在研究在 Google 的托管 VM 服务上托管的 Django 的简单实现,由 Google 云 SQL 提供支持。我能够很好地部署我的应用程序,但是当我尝试在 Docker 文件中发出一些 Django manage.py 命令时,出现错误。
这是我的 Docker 文件:
FROM gcr.io/google_appengine/python
RUN virtualenv /venv -p python3.4
ENV VIRTUAL_ENV /venv
ENV PATH /venv/bin:$PATH
# Install dependencies.
ADD requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt
# Add application code.
ADD . /app
# Overwrite the settings file with the PROD variant.
ADD my_app/settings_prod.py /app/my_app/settings.py
WORKDIR /app
RUN python manage.py migrate --noinput
# Use Gunicorn to serve the application.
CMD gunicorn --pythonpath ./my_app -b :$PORT --env DJANGO_SETTINGS_MODULE=my_app.settings my_app.wsgi
# [END docker]
非常基础。如果我排除 RUN python manage.py migrate --noinput
行,并使用 GCloud 工具进行部署,一切正常。如果我随后登录到 VM,我可以毫无问题地发出 manage.py migrate
命令。
但是,为了简化部署,我非常希望能够从 Docker 文件发出 Django manage.py 命令。目前,如果包含 manage.py
语句,我会得到以下错误:
django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/cloudsql/my_app:us-central1:my_app_prod_00' (2)")
似乎是一个足够简单的错误,但它让我难住了,因为连接肯定是有效的。正如我所说,如果我在不发出 manage.py
命令的情况下进行部署,则一切正常。 Django可以连接数据库,我可以在VM上手动下命令。
我想知道我的问题的原因是否是部署 Docker 文件时 sql 代理 (cloudsql/
) 不存在。如果是这样,我该如何解决这个问题?
我是 Docker 的新手(这是我的第一次尝试)并且是 Django 的新手,所以我不确定处理这种性质的部署的正确方法是什么。我应该将此命令放在其他地方吗?
部署应用程序涉及两个步骤。
第一步,Dockerfile 用于构建镜像,这可以发生在你的机器上,也可以发生在另一台机器上。
在第二步中,创建的 docker 映像在托管 VM 上执行。
运行 指令在 构建 图像时执行,而不是 运行 时执行。
你应该把manage.py移动到CMD命令里,在图片处理的时候是运行运行.
CMD python manage.py migrate --noinput && gunicorn --pythonpath ./my_app -b :$PORT --env DJANGO_SETTINGS_MODULE=my_app.settings my_app.wsgi
我正在研究在 Google 的托管 VM 服务上托管的 Django 的简单实现,由 Google 云 SQL 提供支持。我能够很好地部署我的应用程序,但是当我尝试在 Docker 文件中发出一些 Django manage.py 命令时,出现错误。
这是我的 Docker 文件:
FROM gcr.io/google_appengine/python
RUN virtualenv /venv -p python3.4
ENV VIRTUAL_ENV /venv
ENV PATH /venv/bin:$PATH
# Install dependencies.
ADD requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt
# Add application code.
ADD . /app
# Overwrite the settings file with the PROD variant.
ADD my_app/settings_prod.py /app/my_app/settings.py
WORKDIR /app
RUN python manage.py migrate --noinput
# Use Gunicorn to serve the application.
CMD gunicorn --pythonpath ./my_app -b :$PORT --env DJANGO_SETTINGS_MODULE=my_app.settings my_app.wsgi
# [END docker]
非常基础。如果我排除 RUN python manage.py migrate --noinput
行,并使用 GCloud 工具进行部署,一切正常。如果我随后登录到 VM,我可以毫无问题地发出 manage.py migrate
命令。
但是,为了简化部署,我非常希望能够从 Docker 文件发出 Django manage.py 命令。目前,如果包含 manage.py
语句,我会得到以下错误:
django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/cloudsql/my_app:us-central1:my_app_prod_00' (2)")
似乎是一个足够简单的错误,但它让我难住了,因为连接肯定是有效的。正如我所说,如果我在不发出 manage.py
命令的情况下进行部署,则一切正常。 Django可以连接数据库,我可以在VM上手动下命令。
我想知道我的问题的原因是否是部署 Docker 文件时 sql 代理 (cloudsql/
) 不存在。如果是这样,我该如何解决这个问题?
我是 Docker 的新手(这是我的第一次尝试)并且是 Django 的新手,所以我不确定处理这种性质的部署的正确方法是什么。我应该将此命令放在其他地方吗?
部署应用程序涉及两个步骤。
第一步,Dockerfile 用于构建镜像,这可以发生在你的机器上,也可以发生在另一台机器上。
在第二步中,创建的 docker 映像在托管 VM 上执行。
运行 指令在 构建 图像时执行,而不是 运行 时执行。
你应该把manage.py移动到CMD命令里,在图片处理的时候是运行运行.
CMD python manage.py migrate --noinput && gunicorn --pythonpath ./my_app -b :$PORT --env DJANGO_SETTINGS_MODULE=my_app.settings my_app.wsgi