自定义基础镜像
概述
了解如何自定义应用程序的环境。
大多数 Galaxy 用户使用 默认基础镜像 运行其应用程序。这为运行大多数 Meteor 应用程序提供了基本环境。
为了完全控制应用程序的环境,您可以提供自定义基础镜像。这使您可以精确控制应用程序可用的系统软件包集,自定义 Galaxy 在部署时构建应用程序镜像和运行应用程序时发生的确切情况,甚至允许您在 Galaxy 上运行非 Meteor 软件。
基础镜像是 Docker 镜像。基础镜像必须位于 Docker Hub 上,并且必须可供公众读取。(这意味着它们不应包含任何机密信息。)
您可以使用 Dockerfile 构建基础镜像。您应该使用 Dockerfile 为基础镜像选择一个操作系统(例如 ubuntu:16.04)并安装软件包。您可以查看 Galaxy 默认基础镜像的源代码 以获取灵感。Dockerfile 还应添加一个名为 /app/setup.sh 的文件,并使用 CMD 或 ENTRYPOINT 指令指定要运行的命令。有关更多详细信息,请参阅 Docker 文档。
构建基础镜像并将其推送到 Docker Hub 后,在 galaxy.meteor.com 中的 settings.json 文件的 baseImage 下指定它(位于 env 旁边)。您需要同时指定 Docker 存储库(通常包含您的用户名)和要使用的标签。例如,您的设置文件可能如下所示
{
"galaxy.meteor.com": {
"env": { "MONGO_URL": "mongodb://..." },
"baseImage": {
"repository": "username/my-galaxy-base-image",
"tag": "v23"
}
}
}
Docker 允许您将新镜像推送到现有标签。目前,如果您这样做,Galaxy 不会重建您的应用程序,直到您执行另一次 meteor deploy。我们可能会在将来更改此策略。我们建议您每次更改基础镜像时都使用一个新标签,并在您的 baseImage 规范中指定该标签,而不是像 latest 这样的可变标签。
构建时行为
运行 meteor deploy 时,您的本地 meteor 命令行工具会构建您的应用程序,将其捆绑到一个 tarball 中,并将其上传到 Galaxy。
然后,Galaxy 通过使用 /bin/bash 运行镜像内的 /app/setup.sh 脚本,基于默认基础镜像构建应用程序的 Docker 镜像。每个自定义基础镜像都必须包含 /bin/bash 和 /app/setup.sh。(我们可能会在将来放宽此要求,以允许 /app/setup.sh 与任何 shell 一起使用,因此您必须确保 /app/setup.sh 设置了可执行位,并且它具有正确的 shebang 行。)
Galaxy 向您的设置脚本提供一个参数:应用程序 tarball 的 URL。请注意,此 URL 并非保证永远有效:您的设置脚本应在构建阶段下载 tarball,而不是存储用于运行阶段的 URL。我们建议您使用以下命令下载并展开 tarball:
cd /app && curl -sS "$1" | tar xz -m
(-m 标志忽略用于运行 meteor deploy 的计算机的时间戳;如果该计算机存在时钟偏差,则某些构建系统可能会感到困惑,因此最好在镜像构建器中设置时间戳。)
该脚本应执行所需的任何其他构建时行为,例如调用 npm install 或其他构建系统。
运行时行为
要运行您的应用程序,Galaxy 会通过 CMD 或 ENTRYPOINT 指令调用 Dockerfile 中指定的任何命令。它不会向命令提供任何其他参数。Galaxy 设置了在容器环境下记录的环境变量。
您的命令应运行一个侦听 $PORT 环境变量指定的端口的服务器。即使您使用 Galaxy 运行的代码不是传统的 Web 服务器(例如,您主应用程序的某种辅助进程),Galaxy 也希望看到一个正常运行的 Web 服务器,以便认为您的应用程序是健康的。如果您选择在 Galaxy 上部署没有 Web 服务器的软件,则应在应用程序的设置页面上禁用不健康的容器替换。但是,我们建议您公开一个 Web 服务器,以便您可以判断您的容器是否健康。
您的容器将继续运行,直到其指定的命令完成或 Galaxy 停止它。
Puppeteer
此镜像 (meteor/galaxy-puppeteer) 捆绑了 puppeteer 能够运行所需的每个库。您可以通过将以下内容添加到您的 settings.json 中来使用它
{
"galaxy.meteor.com": {
"env": { "MONGO_URL": "mongodb://..." },
"baseImage": {
"repository": "meteor/galaxy-puppeteer",
"tag": "latest"
}
}
}
还期望您对 puppeteer 的使用使用以下标志
const browser = await puppeteer.launch({
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage'
]
});
const page = await browser.newPage();
await page.goto("https://www.google.com");
更新日期:2024/05/07
谢谢!