laravel - docker compose 构建序列
问题描述
我有一个多容器应用程序(Laravel+Nginx+PostgreSQL),我使用 docker compose 来构建我的应用程序。
我需要php artisan migrate
在构建过程中在我的 Laravel 容器中运行,但我有一个问题 - Laravel 容器可以在 Postgres 容器之前开始构建,所以我收到错误,因为我的数据库主机没有准备好。如何在我的 中设置诸如“构建顺序”之类的内容docker-compose.yml
?
我的当前docker-compose.yml
:
version: '3.3'
services:
phpfpm:
build:
context: laravel-docker
depends_on:
- db
container_name: phpfpm
restart: always
volumes:
- /var/www/html/vendor/
- ./laravel-docker:/var/www/html
networks:
- app-network
db:
image: postgres:9.6.5-alpine
container_name: db
restart: always
environment:
POSTGRES_DB: blabla
POSTGRES_USER: blabla
POSTGRES_PASSWORD: blabla
volumes:
- ./db_data:/var/lib/postgresql/data
ports:
- "5432:5432"
networks:
- app-network
和laravel-docker/Dockerfile
:
FROM php:7.3.0-fpm-alpine3.8
//...
RUN chown -R www-data:www-data /var/www/html
RUN chmod 755 -R /var/www/html && chmod -R o+w storage/
USER www-data
RUN composer install
RUN composer dump-autoload
COPY .env.example .env
// I need to migrate here when DB container will be ready
解决方案
Dockerfile 不是数据库迁移操作的好选择。图像应该能够独立于其他容器构建自身。
数据库迁移更适合作为启动时操作,而不是构建时操作。它的一个好地方是图像的入口点脚本,或者在引导 docker 堆栈时作为单独的“init”作业 - 取决于您感觉更舒服的内容。
推荐阅读
- sql-server - SQL Server - 如何将子查询更改为连接以进行查询优化
- net-snmp - 如何为 SNMP4J 设置指定的引擎 ID 以发送 V3 陷阱
- javascript - 处理从服务器返回的图像二进制文件
- css - 我可以防止 CSS 属性 Content 覆盖 min-height 属性吗?
- c# - 相机行为
- apache-spark - 是否可以在已经运行的 java 进程中生成 Spark 执行器(Ignite JVM)
- javascript - ng-hide 并在 ng-repeat 中显示
- amazon-web-services - 除了我的 hostgator 名称服务器,我还可以使用 Route53 名称服务器吗?
- amazon-web-services - “aws ecs describe-clusters”不返回集群
- sql - 存储有关表类型和对象类型的元数据的 Oracle 数据字典视图是什么?