在哪里放置php artisan migration命令

Tar*_*ung 13 php laravel docker docker-stack

试图在docker stack上部署laravel应用程序。我感到困惑或无法弄清的是,我可以在哪里运行此php artisan migrate:fresh生成mysql中所需的表。

服务和任务运行良好

docker-compose.yml

version: '3.3'

networks:
  smstake: 
    ipam:
      config:
        - subnet: 10.0.10.0/24

services:

    db:
        image: mysql:5.7
        networks:
          - smstake
        ports:
          - "3306:3306"
        volumes:
          - db_data:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: smstake
          MYSQL_USER: root
          MYSQL_PASSWORD: password
        deploy:
          mode: replicated
          placement:
            constraints:
              - node.role == manager
    app:

        image: smstake:latest          
        ports:
          - 8000:80
        networks:
          - smstake

        command: docker-compose exec app php artisan migrate --seed
        deploy:
          mode: replicated
          replicas: 1
          placement:
            constraints:
              - node.role == manager
volumes:
    db_data:
Run Code Online (Sandbox Code Playgroud)

这是用于生成映像的dockerfile

FROM alpine

ENV \
  APP_DIR="/app" \
  APP_PORT="80"

# the "app" directory (relative to Dockerfile) containers your Laravel app...
COPY app/ $APP_DIR
# or we can make the volume in compose to say use this directory 

RUN apk update && \
    apk add curl \
    php7 \
    php7-opcache \
    php7-openssl \
    php7-pdo \
    php7-json \
    php7-phar \
    php7-dom \
    php7-curl \
    php7-mbstring \
    php7-tokenizer \
    php7-xml \
    php7-xmlwriter \
    php7-session \
    php7-ctype \
    php7-mysqli \
    php7-pdo \
    php7-pdo_mysql\
    && rm -rf /var/cache/apk/*

RUN curl -sS https://getcomposer.org/installer | php -- \
  --install-dir=/usr/bin --filename=composer

RUN cd $APP_DIR && composer install

WORKDIR $APP_DIR

RUN chmod -R 775 storage
RUN chmod -R 775 bootstrap

#CMD php artisan migrate:fresh
CMD php artisan serve --host=0.0.0.0 --port=$APP_PORT
Run Code Online (Sandbox Code Playgroud)

尝试按注释添加到Dockerfile中,但未能解决问题

尝试添加docker-compose作为命令:php artisan migration:fresh too

以前是在jenkins中这样做以使其正常工作,现在不希望通过jenkins

docker-compose up -d --force-recreate --build 

#Running commands on already running service 
docker-compose exec -T app php artisan migrate:fresh --seed --force
Run Code Online (Sandbox Code Playgroud)

Tun*_*gac 20

在我看来,创建容器时自动迁移并不是一个好方法。您可以在容器启动后手动使用这一行代码执行此操作;

docker exec your_container_name php artisan migrate
Run Code Online (Sandbox Code Playgroud)


Tar*_*ung 7

这就是我的解决方法。创建了一个名为run.sh的bash脚本,并添加了php artisan migrations命令和php serve命令。

运行

#!/bin/sh

cd /app  
php artisan migrate:fresh --seed
php artisan serve --host=0.0.0.0 --port=$APP_PORT
Run Code Online (Sandbox Code Playgroud)

在Dockerfile中添加了入口点,最后删除了CMD ,它将运行所需的命令。

copy ./run.sh /tmp    
ENTRYPOINT ["/tmp/run.sh"]
Run Code Online (Sandbox Code Playgroud)

从docker-compose.yml中删除命令

  • 我想主要的警告是每次启动容器时它都会运行迁移。这可能不是我们所希望的。 (5认同)
  • 这种方法对我不起作用。我遇到了完全相同的问题。当实际运行 run.sh 时,似乎数据库没有启动并运行。有什么想法吗? (3认同)

Tha*_*mer -5

要运行所有迁移,您需要在容器内,为此您需要使用 来运行容器docker-compose up,这里您需要在 docker-compose.yml 文件所在的目录中使用终端。

之后,在 docker-compose.yml 文件的相同位置,在容器内运行以下命令:

docker exec -it name_of_container bash
Run Code Online (Sandbox Code Playgroud)

当您进入容器内时,请转到容器内的共享应用程序,我认为这是该应用程序cd app

运行完所有这些之后:

php artisan migrate
Run Code Online (Sandbox Code Playgroud)