首页 > 解决方案 > 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

标签: laraveldockerdocker-compose

解决方案


Dockerfile 不是数据库迁移操作的好选择。图像应该能够独立于其他容器构建自身。

数据库迁移更适合作为启动时操作,而不是构建时操作。它的一个好地方是图像的入口点脚本,或者在引导 docker 堆栈时作为单独的“init”作业 - 取决于您感觉更舒服的内容。


推荐阅读