【问题标题】:Django Manage.py Migrate from Google Managed VM Dockerfile - How?Django Manage.py 从 Google Managed VM Dockerfile 迁移 - 如何?
【发布时间】:2016-02-03 21:58:18
【问题描述】:

我正在研究托管在 Google 托管 VM 服务上的 Django 的简单实现,该服务由 Google Cloud SQL 提供支持。我能够很好地部署我的应用程序,但是当我尝试在 Dockerfile 中发出一些 Django manage.py 命令时,我得到了错误。

这是我的 Dockerfile:

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 命令。

但是,为了简化部署,我真的希望能够从 Dockerfile 发出 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上手动发出命令。

我想知道我的问题的原因是否是在部署 Dockerfile 时 sql 代理 (cloudsql/) 不存在。如果是这样,我该如何解决这个问题?

我是 Docker 新手(这是我的第一次尝试)和 Django 新手,所以我不确定处理这种性质的部署的正确方法是什么。我应该把这个命令放在别处吗?

【问题讨论】:

  • 尝试在“docker run”命令中添加“-v /cloudsql:/cloudsql”
  • 谢谢。那很有帮助。它至少让我看到了完整的异常转储。不过,如上所述,只有一个例外,所以它没有给我留下任何新信息。仍然不确定为什么在 dockerfile 完成之前我无法通过套接字连接。
  • 你能显示你用来运行容器的命令吗? “-v /cloudsql:/cloudsql”应该将套接字暴露给容器。
  • @Vadim - 抱歉,我误解了你的建议。我在 python 命令中添加了详细信息以获得更详细的跟踪。我正在使用 Google Managed VM,因此 docker 命令的执行由它们管理。我只是提供 dockerfile。

标签: django google-cloud-sql dockerfile managed-vm google-managed-vm


【解决方案1】:

部署应用程序涉及两个步骤。

在第一步中,Dockerfile 用于构建映像,这可能发生在您的机器上或另一台机器上。

第二步,创建的 docker 镜像在 Managed VM 上执行。

构建映像时执行 RUN 指令,而不是在运行时执行。

您应该将 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

【讨论】:

  • 谢谢!那行得通!感谢您添加的额外清晰度。
猜你喜欢
  • 2013-12-12
  • 2016-03-25
  • 2019-01-23
  • 2020-11-23
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多