如何使用Elastic Beanstalk部署Docker化Laravel应用并解决依赖安装问题
问题根本原因
你的docker-compose.yml中配置了本地目录挂载规则./:/usr/share/nginx/app/,容器启动时会用本地项目目录的内容直接覆盖镜像内/usr/share/nginx/app路径下的所有文件。你在Dockerfile构建阶段通过RUN composer install生成的vendor目录属于镜像内部文件,挂载后会被本地没有vendor目录的项目直接覆盖,自然就看不到生成的依赖文件。
你之前部署Node.js应用没遇到这个问题,大概率是你之前的Node.js部署没有用本地目录覆盖容器内的代码路径,直接用了镜像内置的代码。
开发环境适配方案
开发阶段需要本地代码修改实时同步到容器,所以不能直接去掉挂载,需要调整挂载规则,排除vendor目录不被本地覆盖:
修改docker-compose.yml中app服务的volumes配置:
volumes: - ./:/usr/share/nginx/app/ # 增加下面这条,将vendor目录挂载留空,使用镜像内的vendor文件 - /usr/share/nginx/app/vendor
nginx服务的volumes也同步加这条排除规则,避免nginx读取不到依赖相关的静态资源:
volumes: - ./:/usr/share/nginx/app/ - ./nginx/conf.d/:/etc/nginx/conf.d - /usr/share/nginx/app/vendor
调整后本地启动docker compose up -d就不需要提前手动执行composer install了,直接用镜像构建阶段生成的依赖。
Elastic Beanstalk 生产部署方案
生产环境不需要本地代码挂载,你完全不需要把vendor目录打包到部署zip包,正确的部署流程如下:
- 先修改
docker-compose.yml,删除所有本地代码挂载规则,生产环境直接使用镜像内部的代码和依赖:
version: '3' services: #PHP Service app: build: context: ./ dockerfile: Dockerfile image: admin container_name: admin-app restart: unless-stopped working_dir: /usr/share/nginx/app/ networks: - app-network nginx: image: nginx:stable-alpine container_name: admin-nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: # 只保留nginx配置挂载,或者直接把配置打包到自定义nginx镜像里都可以 - ./nginx/conf.d/:/etc/nginx/conf.d networks: - app-network #Docker Networks networks: app-network: driver: bridge
- 部署用的zip包只需要打包项目源码、Dockerfile、docker-compose.yml、nginx配置文件即可,不需要包含vendor、node_modules这类可以通过构建生成的依赖目录,注意要把
.dockerignore文件加上以下内容,避免构建时把本地的依赖、缓存传到镜像构建上下文:
/vendor /node_modules .env storage/logs/* bootstrap/cache/* .DS_Store .git .gitignore
- 直接把zip包上传到Elastic Beanstalk部署即可,平台会自动执行镜像构建,Dockerfile中的
composer install生成的vendor会保留在镜像内部,不会被覆盖。
内容的提问来源于stack exchange,提问作者The_ehT
相关产品推荐
相关产品推荐

