在 GCP 云构建上构建 Django 项目
Building Django-Projects on GCPs Cloud-Build
最近,我们开始着手将已建立的 Django 项目从 docker 堆栈转换为 Google App Engine。途中,Google Cloud Build 竟然派上了用场。 Cloudbuild 负责一些准备推出的项目,特别是应用程序的前端部分。
现在谈到 python 和 Django 特定任务时,显而易见的选择也是求助于 cloudbuild。因此,我们尝试遵循 Google 用他们的官方 NPM 云构建器 (here)
解释的模式
我们面临的问题如下。使用官方 python 镜像构建时,构建步骤设置如下:
steps:
[...]
8 - name: 'python:3.7'
9 entrypoint: python3
10 args: ['-m', 'pip', 'install', '-r', 'requirements.txt']
11 - name: 'python:3.7'
12 entrypoint: python3
13 args: ['./manage.py', 'collectstatic', '--noinput']
这对于安装所有要求的第一步来说效果很好。 GAE 在部署应用程序时也会这样做,但这里有必要从存储库中 collectstatic 并安装 django 应用程序,然后再上传它们。
虽然第一步通过上述操作成功,但第二步失败并出现以下错误:
File "./manage.py", line 14, in <module>
) from exc
ImportError: Couldn't import Django. Are you sure it's installed and
available on your PYTHONPATH environment variable? Did you forget to
activate a virtual environment?
有没有更好的方法来处理这种情况?
/workspace
目录之外的任何内容都不会在构建之间保留,因此您正在安装的要求不会进入第二步。来自 "Creating Custom Build Steps":
A custom build step runs with the source mounted under /workspace
, and is run with a working directory somewhere in /workspace
. Any files left in /workspace
by a given build step are available to other build steps, whether those steps are run concurrently or subsequently.
解决此问题的一种方法是将它们安装到当前目录中:
- name: 'python:3.7'
entrypoint: python3
args: ['-m', 'pip', 'install', '-t', '.', '-r', 'requirements.txt']
- name: 'python:3.7'
entrypoint: python3
args: ['./manage.py', 'collectstatic', '--noinput']
同样,也可以创建一个虚拟环境,并为每个需要安装依赖项的步骤激活它。
不需要直接在工作区文件夹中安装需求包。
您可以在安装要求时使用 --user 标志。
使用 --user 时,它将在构建步骤之间保留包。
当您直接在文件夹中安装包时,您将使用应用程序部署上传它们,使您的上传比需要的更大。
你可以使用类似这样的东西。
- name: 'python:3.7'
entrypoint: python3
args: ['-m', 'pip', 'install','-r','requirements.txt', '--user']
id: pip_install
- name: 'python:3.7'
entrypoint: python3
args: ['./manage.py', 'collectstatic', '--noinput']
waitFor:
- pip_install
最近,我们开始着手将已建立的 Django 项目从 docker 堆栈转换为 Google App Engine。途中,Google Cloud Build 竟然派上了用场。 Cloudbuild 负责一些准备推出的项目,特别是应用程序的前端部分。
现在谈到 python 和 Django 特定任务时,显而易见的选择也是求助于 cloudbuild。因此,我们尝试遵循 Google 用他们的官方 NPM 云构建器 (here)
解释的模式我们面临的问题如下。使用官方 python 镜像构建时,构建步骤设置如下:
steps:
[...]
8 - name: 'python:3.7'
9 entrypoint: python3
10 args: ['-m', 'pip', 'install', '-r', 'requirements.txt']
11 - name: 'python:3.7'
12 entrypoint: python3
13 args: ['./manage.py', 'collectstatic', '--noinput']
这对于安装所有要求的第一步来说效果很好。 GAE 在部署应用程序时也会这样做,但这里有必要从存储库中 collectstatic 并安装 django 应用程序,然后再上传它们。
虽然第一步通过上述操作成功,但第二步失败并出现以下错误:
File "./manage.py", line 14, in <module>
) from exc
ImportError: Couldn't import Django. Are you sure it's installed and
available on your PYTHONPATH environment variable? Did you forget to
activate a virtual environment?
有没有更好的方法来处理这种情况?
/workspace
目录之外的任何内容都不会在构建之间保留,因此您正在安装的要求不会进入第二步。来自 "Creating Custom Build Steps":
A custom build step runs with the source mounted under
/workspace
, and is run with a working directory somewhere in/workspace
. Any files left in/workspace
by a given build step are available to other build steps, whether those steps are run concurrently or subsequently.
解决此问题的一种方法是将它们安装到当前目录中:
- name: 'python:3.7'
entrypoint: python3
args: ['-m', 'pip', 'install', '-t', '.', '-r', 'requirements.txt']
- name: 'python:3.7'
entrypoint: python3
args: ['./manage.py', 'collectstatic', '--noinput']
同样,也可以创建一个虚拟环境,并为每个需要安装依赖项的步骤激活它。
不需要直接在工作区文件夹中安装需求包。 您可以在安装要求时使用 --user 标志。 使用 --user 时,它将在构建步骤之间保留包。
当您直接在文件夹中安装包时,您将使用应用程序部署上传它们,使您的上传比需要的更大。
你可以使用类似这样的东西。
- name: 'python:3.7'
entrypoint: python3
args: ['-m', 'pip', 'install','-r','requirements.txt', '--user']
id: pip_install
- name: 'python:3.7'
entrypoint: python3
args: ['./manage.py', 'collectstatic', '--noinput']
waitFor:
- pip_install