尝试在docker堆栈.What上部署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:
这里的是用来生成镜像的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
尝试按注释添加到Dockerfile文件,但没有解决问题
尝试添加docker-compose as命令: php artisan migrate: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
发布于 2018-02-19 00:38:55
这就是我如何解决这个问题的,一个叫做run.sh的bash脚本,然后添加了php artisan .Created命令和php serve命令。
run.sh
#!/bin/sh
cd /app
php artisan migrate:fresh --seed
php artisan serve --host=0.0.0.0 --port=$APP_PORT
将入口点添加到Dockerfile文件中,最后删除CMD,这将运行所需的命令。
copy ./run.sh /tmp
ENTRYPOINT ["/tmp/run.sh"]
从docker-compose.yml文件中删除该命令
发布于 2020-11-20 23:07:02
是的,特别的剧本。我尝试构建部署和测试抛出docker-compose,所以在docker-service“job”中启动supervisor之前,我在脚本中运行迁移:
#!/bin/sh
cd /var/www
php artisan migrate --seed
/usr/bin/supervisord -n -c /etc/supervisord.conf
和来自我的deploy-docker-compose.yml的片段:
services:
nginx:
depends_on:
- phpfpm ## NOT START BEFORE PHPFPM
phpfpm:
depends_on:
- jobs ## NOT START BEFORE MIGRATION
jobs:
# ....
此模式尚未在生产中启动;
UPD1
我必须创建简单的laravel命令wait_db_alive:
public function handle()
{
$i = 1;
$ret = 1;
while($i <= 10){
echo 'connecting to host:'.config('database.connections.'.config('database.default').'.host').' try '.$i.'..';
try {
DB::connection()->getPdo();
echo 'ok'.PHP_EOL;
$ret = 0;
break;
} catch (\Exception $e) {
echo 'error:' . $e->getMessage() .PHP_EOL;
sleep(1);
$i++;
}
}
return $ret;
}
并编辑init.sh以
#!/bin/sh
php artisan wait_db_alive && php artisan migrate --seed && /usr/bin/supervisord -n -c /etc/supervisord.conf
因此,记录作业:
jobs_1 | connecting to host:db try 1..error:SQLSTATE[HY000] [2002] Connection refused
jobs_1 | connecting to host:db try 2..error:SQLSTATE[HY000] [2002] Connection refused
jobs_1 | connecting to host:db try 3..ok
jobs_1 | Nothing to migrate.
jobs_1 | Seeding: ServicesTableSeeder
...
jobs_1 | Database seeding completed successfully.
jobs_1 | 2020-11-22 05:33:43,653 CRIT Supervisor is running as root.
UPD2
在某些情况下,我们需要在没有.env-file的情况下启动容器,这样做更好的init.sh:
#!/bin/sh
php artisan wait_db_alive && php artisan migrate --seed
/usr/bin/supervisord -n -c /etc/supervisord.conf
发布于 2021-03-07 20:15:48
在我看来,自动迁移在创建容器时不是一个好方法。您可以在container使用这一行代码后手动执行此操作;
docker exec your_container_name php artisan migrate
https://stackoverflow.com/questions/48850813
复制相似问题