容器

概述

每个构建版本都隔离在其自己的容器(Linux 命名空间容器)中。

基础是一个Ubuntu系统,其中安装了Odoo所有必需的依赖项以及常见的有用包。

如果您的项目需要其他 Python 依赖项或更新的版本,则可以在列出它们的分支的根目录中定义一个 :file:requirements.txt 文件。平台将负责在容器中安装这些依赖项。“pip 要求说明符<https://pip.pypa.io/en/stable/reference/pip_install/#requirement-specifiers>”_ 文档可以帮助您编写 :file:requirements.txt 文件。要有一个具体的例子,请查看Odoo<https://github.com/odoo/odoo/blob/14.0/requirements.txt>_的“需求.txt文件。

子模块的 :file:requirements.txt 文件也被考虑在内。该平台在包含Odoo模块的每个文件夹中查找:file:`requirements.txt`文件:不是在模块文件夹本身,而是在其父文件夹中。

目录结构

由于容器是基于Ubuntu的,因此它们的目录结构遵循linux文件系统层次结构标准。“Ubuntu 的文件系统树概述<https://help.ubuntu.com/community/LinuxFilesystemTreeOverview#Main_directories>”_ 解释了主目录。

以下是 Odoo.sh 相关目录:

.
├── home
│    └── odoo
│         ├── src
│         │    ├── odoo                Odoo Community source code
│         │    │    └── odoo-bin       Odoo server executable
│         │    ├── enterprise          Odoo Enterprise source code
│         │    ├── themes              Odoo Themes source code
│         │    └── user                Your repository branch source code
│         ├── data
│         │    ├── filestore           database attachments, as well as the files of binary fields
│         │    └── sessions            visitors and users sessions
│         └── logs
│              ├── install.log         Database installation logs
│              ├── odoo.log            Running server logs
│              ├── update.log          Database updates logs
│              └── pip.log             Python packages installation logs
└── usr
     ├── lib
     │    ├── python2.7
     │         └── dist-packages       Python 2.7 standard libraries
     │    ├── python3
     │         └── dist-packages       Python 3 standard libraries
     │    └── python3.5
     │         └── dist-packages       Python 3.5 standard libraries
     ├── local
     │    └── lib
     │         ├── python2.7
     │         │    └── dist-packages  Python 2.7 third-party libraries
     │         └── python3.5
     │              └── dist-packages  Python 3.5 third-party libraries
     └── usr
          └── bin
               ├── python2.7           Python 2.7 executable
               └── python3.5           Python 3.5 executable

Python 2.7 和 3.5 都安装在容器中。然而:

  • 如果您的项目配置为使用Odoo 10.0,则Odoo服务器将与Python 2.7一起运行。

  • 如果您的项目配置为使用Odoo 11.0或更高版本,则Odoo服务器将与Python 3.5一起运行。

数据库外壳

使用 shell 访问容器时,可以使用 psql 访问数据库。

odoo@odoo-addons-master-1.odoo.sh:~$ psql
psql (9.5.2, server 9.5.11)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

odoo-addons-master-1=>

Be careful ! Use transactions (BEGIN…COMMIT/ROLLBACK) for every sql statements leading to changes (UPDATE, DELETE, ALTER, …), especially for your production database.

交易机制是您在发生错误时的安全网。您只需回滚更改即可将数据库还原到其以前的状态。

例如,您可能会忘记设置 WHERE 条件。

odoo-addons-master-1=> BEGIN;
BEGIN
odoo-addons-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-addons-master-1=> ROLLBACK;
ROLLBACK

在这种情况下,您可以回滚以还原您刚刚错误地执行的不需要的更改,并重写语句:

odoo-addons-master-1=> BEGIN;
BEGIN
odoo-addons-master-1=> UPDATE res_users SET password = '***' WHERE id = 1;
UPDATE 1
odoo-addons-master-1=> COMMIT;
COMMIT

但是,不要忘记在完成事务后提交或回滚事务。打开的事务可能会锁定表中的记录,并且正在运行的数据库可能会等待它们被释放。它可能导致服务器无限期挂起。

此外,如果可能,请先使用临时数据库来测试语句。它为您提供了额外的安全网。

运行 Odoo 服务器

您可以从容器 shell 启动 Odoo 服务器实例。您将无法使用浏览器从外部世界访问它,但您可以例如:

  • 使用 Odoo shell,

$  odoo-bin shell
>>> partner = env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1)
>>> partner.name
'ASUSTeK'
>>> partner.name = 'Odoo'
>>> env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1).name
'Odoo'
  • 装载新的模块

$  odoo-bin -i sale --without-demo=all --stop-after-init
  • 更新模块,

$  odoo-bin -u sale --stop-after-init
  • 运行模块的测试,

$  odoo-bin -i sale --test-enable --log-level=test --stop-after-init

在上面的命令中,参数为:

  • “–without-demo=all”阻止加载所有模块的演示数据

  • “—在初始化后停止”将在服务器实例完成您请求的操作后立即将其关闭。

More options are available and detailed in the CLI documentation.

您可以在日志(~/logs/odoo.log)中找到 Odoo.sh 用于运行服务器的插件路径。查找“odoo: 插件路径”:

2018-02-19 10:51:39,267 4 INFO ? odoo: Odoo version 13.0
2018-02-19 10:51:39,268 4 INFO ? odoo: Using configuration file at /home/odoo/.config/odoo/odoo.conf
2018-02-19 10:51:39,268 4 INFO ? odoo: addons paths: ['/home/odoo/data/addons/13.0', '/home/odoo/src/user', '/home/odoo/src/enterprise', '/home/odoo/src/themes', '/home/odoo/src/odoo/addons', '/home/odoo/src/odoo/odoo/addons']

Be careful, especially with your production database. Operations that you perform running this Odoo server instance are not isolated: Changes will be effective in the database. Always, make your tests in your staging databases.

在 Odoo.sh 中调试

调试 Odoo.sh 生成与另一个 Python 应用没有什么不同。本文仅介绍 Odoo.sh 平台的特性和限制,并假定您已经知道如何使用调试器。

注解

如果您还不知道如何调试Python应用程序,则可以在Internet上轻松找到多个入门课程。

您可以使用“pdb”,“pudb”或“ipdb”在 Odoo.sh 调试代码。由于服务器在 shell 外部运行,因此您无法直接从 Odoo 实例后端启动调试器,因为调试器需要一个 shell 才能运行。

然后编辑要触发调试器的代码并添加以下内容:

import sys
if sys.__stdin__.isatty():
    import pdb; pdb.set_trace()

条件:code:`sys.__stdin__.isatty()`是一个黑客,可以检测你是否从shell运行Odoo。

保存文件,然后运行 Odoo Shell:

$ odoo-bin shell

最后,*通过*Odoo Shell,您可以触发要调试的代码/函数/方法。

Console screenshot showing ``pdb`` running in an Odoo.sh shell.