【问题标题】:How to run db migration when Laravel container is up?Laravel 容器启动时如何运行数据库迁移?
【发布时间】:2022-06-14 02:57:50
【问题描述】:

我在容器启动时运行数据库迁移时遇到问题。

问题:

  • 无法设置应用密钥,因为 gitlab-ci 没有复制 .env 文件(在 gitlab ci 控制台中出现错误),因此需要稍后设置密钥
  • 正在运行迁移并等待它,因为容器以成功代码 0 退出(迁移已启动)

我只会为我的数据库和网络容器放置代码。

db:
    container_name: db
    image: mysql:5.7.22
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    ports:
      - 3306:3306
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - my-network

backend:
    image: registry image
    container_name: "backend"
    build:
      context: ./backend
      dockerfile: Dockerfile
    depends_on:
      - db
    ports:
      - 1020:80
    networks:
      - my-network

gitlab-ci:

build-backend:
  tags:
    - vps
  variables:
    GIT_CLEAN_FLAGS: none
  stage: dockerize
  image: docker:latest
  services:
    - docker:dind
  dependencies: []
  script:
    - docker build -t backend backend
    - cp .env ./backend/.env
    - cd backend
    - docker build -t $CI_REGISTRY_IMAGE/backend:$CI_COMMIT_BRANCH .
    - docker tag $CI_REGISTRY_IMAGE/backend:$CI_COMMIT_BRANCH $CI_REGISTRY_IMAGE/frontend:$CI_COMMIT_REF_NAME
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker push $CI_REGISTRY_IMAGE/backend:$CI_COMMIT_REF_NAME

...部署代码

我正在使用https://github.com/vishnubob/wait-for-it

Dockerfile:

FROM webdevops/php-nginx:7.4-alpine

# Install Laravel framework system requirements (https://laravel.com/docs/8.x/deployment#optimizing-configuration-loading)
RUN apk add oniguruma-dev postgresql-dev libxml2-dev
RUN docker-php-ext-install \
        bcmath \
        ctype \
        fileinfo \
        json \
        mbstring \
        pdo_mysql \
        pdo_pgsql \
        tokenizer \
        xml

# Copy Composer binary from the Composer official Docker image
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
ENV WEB_DOCUMENT_ROOT /var/www/html/public
ENV APP_ENV production
WORKDIR /var/www/html
COPY . .
RUN composer install --no-interaction --optimize-autoloader

RUN chown -R root:root .

RUN chmod -R ugo+rw storage

RUN chmod 777 wait-for-it.sh
RUN chmod 777 migrate.sh
EXPOSE 80
CMD ["./wait-for-it.sh", "db:3306", "--", "./migrate.sh"]

迁移.sh:

#!/bin/sh

php artisan key:generate
# Optimizing Configuration loading
php artisan config:cache
# Optimizing Route loading
php artisan route:cache
# Optimizing View loading
php artisan view:cache
echo "finished cashes"
php artisan migrate --force &
exec "$@"

那么我该如何解决退出代码0,意思是说如何防止容器停止? 谢谢

【问题讨论】:

    标签: laravel docker dockerfile gitlab-ci docker-registry


    【解决方案1】:

    解决方案是使用 Supervisor,这对于在后台运行所有作业很有用,并且在运行迁移时不会关闭您的容器。 我不敢相信这个 repo 中的这个配置可以完美地工作,它节省了我的时间。我花了超过 7 天的时间寻找最佳解决方案,但发布此内容的人救了我!

    请参考此回购https://github.com/harshalone/laravel-9-production-ready

    我不必更改一行代码,希望您也不必更改。简单有效!

    【讨论】:

      【解决方案2】:

      对于任何努力运行迁移但您的数据库在您的 Laravel 应用程序之前没有启动的人,只想提一下,我使用了等待它的脚本并更改了我的 Dockerfile 中的最后一行代码,如下所示:

      CMD ["/var/www/docker/wait-for-it.sh", "db:3306", "--", "/var/www/docker/run.sh"]
      

      所以现在我的迁移将首先等待数据库启动并运行。 只需将 wait-for-it.sh 放在 docker 文件夹中或直接从 github 使用它。

      【讨论】:

        猜你喜欢
        • 2015-12-28
        • 2021-05-23
        • 2017-05-25
        • 2014-11-15
        • 2021-09-14
        • 2018-09-24
        • 2016-09-19
        • 2021-10-02
        • 1970-01-01
        相关资源
        最近更新 更多