我有一个内部工具,可以让我编辑配置文件,然后配置文件会同步到Google存储空间(* * * * * gsutil -m rsync -d /data/www/config_files/ gs://my-site.appspot.com/configs/
)。
如何在Google App Engine中的多个实例中使用这些配置文件? (我不想使用Google PHP SDK读取/写入存储桶中的配置文件。)
我唯一能想到的就是创建一个cron.yaml
文件,每分钟从桶中下载配置到/app/configs/
,但是我必须每分钟重新加载php-fpm同样。
的app.yaml:
runtime: custom
env: flex
service: my-site
env_variables:
CONFIG_DIR: /app/configs
resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10
automatic_scaling:
min_num_instances: 2
max_num_instances: 20
cpu_utilization:
target_utilization: 0.5
Dockerfile:
FROM eu.gcr.io/google-appengine/php71
RUN mkdir -p /app;
ADD . /app
RUN chmod -R a+r /app
答案 0 :(得分:0)
我假设您正在设计一个解决方案,您可以在GCS存储桶上使用拉取请求来快速配置和更新应用程序。
此过程中有很多要点,具体取决于您的确切流程,您可以在哪里插入"请立即更新"命令。例如,为什么在更新GCS存储桶中的配置时,您只是简单地排队任务?该任务基本上会降低配置并重新部署您的应用程序。
除非您考虑使用可访问该存储桶的多个应用程序,并且您希望能够集中同时更新它们。在这种情况下,您的cron作业解决方案是有道理的。 Dan的建议肯定有效,但我认为你可以通过使用版本号来简化它。只需要另一个带有版本号的文件,cron作业就会拉出该文件,对其进行比较,然后在版本较新的情况下执行更新。它与Dan的解决方案非常相似,除非你真的不需要散列任何东西。如果您使用配置更新GCS,也可以使用版本信息标记另一个文件。
另一种解决方案是在所有这些应用程序中公开处理程序,例如" / update"处理程序。无论何时命中,应用程序都会执行更新。只要您实际更新GCS中的配置,就可以点击该处理程序。这更像是推动解决方案。优点是您可以更好地控制哪些应用程序获取更新,如果您还不确定某个配置,那么这可能非常有用,因此您不希望一次更新所有内容。
答案 1 :(得分:0)
我们不想在我们的应用程序中为此添加处理程序。我们认为最好使用supervisord。
附加supervisord.conf:
[program:sync-configs]
command = /app/scripts/sync_configs.sh
startsecs = 0
autorestart = false
startretries = 1
sync_configs.sh:
#!/usr/bin/env bash
while true; do
# Sync configs from Google Storage.
gsutil -m rsync -c -r ${CONFIG_BUCKET} /app/config
# Reload PHP-FPM
ps ax | grep php-fpm | cut -f2 -d" " - | xargs kill -s USR2
# Wait 60 seconds.
sleep 60
done
Dockerfile:
COPY additional-supervisord.conf /etc/supervisor/conf.d/