1

最近,我们开始着手将已建立的 Django 项目从 docker stack 转换为 Google App Engine。在此过程中,Google Cloud Build 变得派上了用场。Cloudbuild 在准备推出时会处理一些项目,尤其是应用程序的前端部分。

现在,当涉及到 python 和 Django 特定任务时,显而易见的选择是也求助于 cloudbuild。因此,我们尝试遵循 Google 使用其官方 NPM 云构建器(此处)解释的模式

我们面临的问题如下。使用官方 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 在部署应用程序时也会这样做,但这里有必要在上传之前从存储库中收集静态并安装 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?

有没有更好的方法来处理这种情况?

4

2 回答 2

2

目录之外的任何内容/workspace都不会在构建之间保留,因此您安装的要求不会进入第二步。从“创建自定义构建步骤”

自定义构建步骤使用安装在 . 下的源代码/workspace运行,并使用/workspace. 给定构建步骤留下的任何文件/workspace都可用于其他构建步骤,无论这些步骤是同时运行还是随后运行。

解决此问题的一种方法是将它们安装到当前目录中:

- 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']

同样,也可以创建一个虚拟环境并为需要安装依赖项的每个步骤激活它。

于 2018-12-03T02:19:38.207 回答
2

无需直接在工作区文件夹中安装需求包。您可以在安装要求时使用--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
于 2020-08-04T07:01:04.943 回答