我已经将我的应用程序(PHP Buildpack)部署到生产环境中cf push app-name
。之后,我致力于进一步的功能和错误修复。现在我会将我的本地更改推送到生产环境。但是当我这样做时,保存在生产服务器上的所有图像(例如个人资料图像)都会随着每次推送而丢失。
如何仅接管代码中的更改而不会丢失生产服务器上的任何存储文件?
它应该像一个“ git pull
”
我已经将我的应用程序(PHP Buildpack)部署到生产环境中cf push app-name
。之后,我致力于进一步的功能和错误修复。现在我会将我的本地更改推送到生产环境。但是当我这样做时,保存在生产服务器上的所有图像(例如个人资料图像)都会随着每次推送而丢失。
如何仅接管代码中的更改而不会丢失生产服务器上的任何存储文件?
它应该像一个“ git pull
”
您的应用程序容器应该是无状态的。要持久化数据,您应该使用提供的服务。Swisscom Application Cloud 提供与S3 兼容的动态存储(例如用于图片或用户头像)或不同的数据库服务(MongoDB、MariaDB等)。如果您需要保存用户数据,您应该将其保存在这些服务之一中,而不是应用程序容器的本地文件系统中。如果您的应用程序保持无状态,则可以更轻松地迁移和扩展它。您可以在此处找到有关如何构建应用程序以在现代云环境中运行的更多信息。要获取有关如何将您的应用程序与服务一起使用的更多信息,请查看此链接。
Cloud Foundry 上运行的应用程序不应将文件写入本地文件系统,原因如下:
本地文件系统存储是短暂的。当应用程序实例崩溃或停止时,分配给该实例的资源将由平台回收,包括自应用程序启动以来所做的任何本地磁盘更改。当实例重新启动时,应用程序将以新的磁盘映像启动。虽然您的应用程序可以在运行时写入本地文件,但这些文件会在应用程序重新启动后消失。
同一应用程序的实例不共享本地文件系统。每个应用程序实例都在其自己的隔离容器中运行。因此,由一个实例写入的文件对同一应用程序的其他实例不可见。如果文件是临时的,这应该不是问题。但是,如果您的应用程序需要文件中的数据在应用程序重新启动时保持不变,或者需要在应用程序的所有运行实例之间共享数据,则不应使用本地文件系统。为此,我们建议使用数据库或 blobstore 等共享数据服务。
将来,您的问题将通过Volume Services (Experimental) “解决” 。您的应用程序将拥有一个永久性磁盘。
Cloud Foundry 应用程序开发人员可能希望他们的应用程序安装一个或多个卷,以便写入可靠的非临时文件系统。通过与服务代理和 Cloud Foundry 运行时集成,提供商可以通过自动化、自助服务和按需用户体验向开发人员提供这些服务。
请订阅我们的时事通讯以获取功能公告。还请关注 CF 社区的上游开发。