在创建自定义 Docker 容器动作时,您可以使用 `runs.pre-entrypoint` 和 `runs.post-entrypoint` 字段来分别配置在容器主入口点(entrypoint)执行前和执行后运行的脚本。这允许您在容器启动前执行环境初始化任务(如安装依赖),并在主入口点执行完毕后进行资源清理或日志记录。
**配置前置和后置脚本**
当使用 `runs` 结构并设置 `using: 'docker'` 来定义一个 Docker 容器动作时,可以利用以下字段:
1. **`pre-entrypoint`**: 此字段允许您指定一个脚本,该脚本会在容器的实际 `entrypoint` 动作开始之前运行。GitHub Actions 会使用 `docker run` 启动一个新容器来执行此预入口点脚本。由于这是在一个新的容器中运行的,您需要注意,其运行时状态与主入口点容器是不同的。因此,任何必需的状态都必须通过 `workspace`、`HOME` 或作为 `STATE_` 变量来访问。
2. **`post-entrypoint`**: 此字段允许您指定一个清理脚本,该脚本会在主 `entrypoint` 动作成功完成后运行。与 `pre-entrypoint` 类似,它也会在一个新的容器中执行,因此您需要通过 `workspace`、`HOME` 或 `STATE_` 变量来访问所需状态。
**使用示例**
在动作的元数据文件中,您需要同时定义 `entrypoint`、`pre-entrypoint` 和 `post-entrypoint`,并指定 `runs` 的配置,例如:
```yaml
runs:
using: 'docker'
image: 'Dockerfile'
args:
- 'bzz'
pre-entrypoint: 'setup.sh'
entrypoint: 'main.sh'
post-entrypoint: 'cleanup.sh'
```
**注意事项**
* **默认行为**: `pre-entrypoint` 默认总是运行,但可以通过 `runs.pre-if` 来覆盖此默认行为。
* **状态管理**: 由于 `pre-entrypoint` 和 `post-entrypoint` 是在与主入口点不同的新容器中运行的,因此任何需要跨阶段传递的状态信息,必须使用 `workspace`、`HOME` 或 `STATE_` 变量进行访问。
* **条件控制**: 您可以使用 `runs.pre-if` 和 `runs.post-if` 来定义条件,只有当这些条件满足时,相应的脚本才会执行。
通过这种方式,您可以精细地控制自定义 Docker 容器动作的生命周期,确保在关键的初始化和清理阶段执行必要的脚本逻辑。