如何在docker-compose down/up后保留Laravel Docker应用数据?
问题分析与解决方案
核心问题:路径拼写不匹配
你提到图片实际存储路径是storage/app/public/images,但在docker-compose.yml的卷配置中,你挂载的是imagenes目录:
- './app/storage/app/public/imagenes:/opt/bitnami/laravel/storage/app/public/imagenes'
这意味着上传的图片会被写入容器内未挂载的images目录,而非你预期的挂载目录,所以执行docker-compose down后,容器销毁时这些图片会丢失。
解决方案步骤
1. 修正卷路径匹配
将卷配置中的imagenes改为images,确保和Laravel实际存储路径一致:
volumes: - './app:/opt/bitnami/laravel' - './app/entrypoint.sh:/opt/bitnami/scripts/laravel/entrypoint.sh' - './app/storage/app/public/images:/opt/bitnami/laravel/storage/app/public/images'
2. 优化挂载策略(可选但推荐)
Bitnami官方镜像更推荐使用命名卷而非绑定挂载整个Laravel目录,避免权限冲突和初始化逻辑失效问题。你可以调整存储目录的挂载方式为命名卷:
volumes: - './app/entrypoint.sh:/opt/bitnami/scripts/laravel/entrypoint.sh' - laravel_storage:/opt/bitnami/laravel/storage/app/public/images # 若需要持久化整个storage目录,可改为: # - laravel_storage:/opt/bitnami/laravel/storage # 在文件末尾的volumes块中添加: volumes: mariadb_data: laravel_storage:
这种方式Docker会自动处理目录权限,且数据不会因docker-compose down(无-v参数)而丢失。
3. 修复目录权限(若使用绑定挂载)
如果坚持使用绑定挂载,需确保本地./app/storage/app/public/images目录存在且权限正确(Bitnami容器运行用户为bitnami,UID/GID通常为1001):
mkdir -p ./app/storage/app/public/images chown -R 1001:1001 ./app/storage
4. 验证存储链接
确保php artisan storage:link命令正确创建了软链接,指向挂载的目录。你可以进入容器验证:
docker exec -it wallamotop ls -l public/storage
输出应指向/opt/bitnami/laravel/storage/app/public。
额外优化建议
- 你的
entrypoint.sh中判断docker volume inspect mariadb_data的逻辑存在问题:docker-compose down默认不会删除命名卷,所以该判断只会在第一次创建卷时执行迁移。如果需要根据数据库是否已初始化来决定是否迁移,建议检查数据库中是否存在迁移表(如migrations),而非检查卷是否存在:
if ! php artisan migrate:status >/dev/null 2>&1; then info "Running migrations and seeders..." php artisan migrate --no-interaction php artisan db:seed --no-interaction else info "Database already migrated. Skipping..." fi
内容的提问来源于stack exchange,提问作者PEDRO DANIEL FERNANDEZ GUERRER
相关产品推荐
相关产品推荐

