laravel - 使用 Docker heroku.yml 和 artisan 在 Heroku 上部署 Laravel
问题描述
我想在项目的初始阶段将我的 Laravel 应用程序部署到 heroku 以作为暂存环境。这分别是Dockerfile
和docker-compose
配置。
Dockerfile
:
FROM php:7.2 AS base
RUN apt-get update -y && \
apt-get install -y openssl zip unzip git gnupg2
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && \
apt-get install -y nodejs
RUN curl -sS https://getcomposer.org/installer | \
php -- --install-dir=/usr/local/bin --filename=composer
RUN docker-php-ext-install mbstring pdo pdo_mysql
WORKDIR /app
COPY . /app
FROM base AS dev
RUN apt-get update && apt-get install -y zlib1g-dev
RUN docker-php-ext-install zip
RUN composer install --prefer-dist
RUN npm install && npm run dev
docker-compose.yml
:
version: '3.4'
services:
app:
build:
context: .
dockerfile: Dockerfile
target: dev
command: php artisan serve --host=0.0.0.0 --port=8080
env_file:
- ./etc/env/.env.dev
working_dir: /app
volumes:
- ./:/app
ports:
- 8080:8080
此设置在我的本地部署中运行良好,使用docker-compose up -d
我想尝试使用 heroku.yml将此设置部署到 Heroku 。
这是heroku.yml
设置。
build:
docker:
web: Dockerfile
run:
web: php artisan serve --host=0.0.0.0 --port=$PORT
之后我执行
heroku container:push web
heroku container:release web
命令返回正常。但是当我打开使用heroku open
显示错误。这是来自 的错误日志heroku logs --tail
。
019-02-28T02:18:59.349362+00:00 app[api]: Deployed web (9552e86dc96a) by user *******@****.***
2019-02-28T02:18:59.349362+00:00 app[api]: Release v16 created by user *******@****.***
2019-02-28T02:19:23.326195+00:00 heroku[web.1]: Starting process with command `php -a`
2019-02-28T02:19:25.764530+00:00 heroku[web.1]: State changed from starting to crashed
2019-02-28T02:19:25.744534+00:00 heroku[web.1]: Process exited with status 0
2019-02-28T02:19:25.667622+00:00 app[web.1]: Interactive shell
2019-02-28T02:19:25.667644+00:00 app[web.1]:
2019-02-28T02:19:26.615159+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=***************.herokuapp.com request_id=f81366af-be1e-4a92-a14a-5c726bf163d9 fwd="203.210.84.30" dyno= connect= service= status=503 bytes= protocol=https
我做错什么了?
解决方案
我现在遇到了和你一样的情况,我设法通过使用 buildpacks 而不是编写自己的 docker compose 文件来解决它。
如果你想试试我的解决方案:
- 转到您的 heroku 项目中的设置页面
- 在 Buildpacks 部分下,单击“添加 buildpack”
- 点击nodejs
- 重复相同的过程并单击 PHP
接下来要做的是:
- 再次单击添加 buildpack
- 输入 webback URL https://github.com/dretnan/heroku-buildpack-laravel-deploy-tasks
- 单击保存更改
最后一个 buildpack 允许您使用一些将在部署期间执行的自定义命令来使用自定义变量。
所以你想做的是:
- 在同一设置页面中查找 Config Vars
- 单击“添加”以添加新变量
- 输入“DEPLOY_TASKS”作为密钥
- 输入“npm run heroku-build”作为值(或任何您想要命名自定义脚本的名称)
现在您有一个将在部署期间调用的自定义脚本。
您需要做的最后一件事是转到您的项目并打开 package.json。在该文件中,在“脚本”下添加新行并定义“heroku-build”命令。您的脚本对象应如下所示:
"scripts": {
"dev": "npm run development",
"development": "mix",
"watch": "mix watch",
"watch-poll": "mix watch -- --watch-options-poll=1000",
"hot": "mix watch --hot",
"prod": "npm run production",
"production": "mix --production",
"heroku-build": "php artisan migrate && php artisan cache:clear && chmod -R 777 public"
},
当然,您可以在该行中定义自己的命令,我只是使用了 migrate 和 cache clear,但是如果您需要更多内容,请随意添加您想要的任何内容。
推荐阅读
- javascript - 带有 React 钩子的动态类名没有按预期工作
- flutter - 在接受另一个请求之前等待完整的异步组合函数执行
- powershell - 在脚本中使用 Out-Printer
- microsoft-graph-api - 使用图形 API 按 createdDateTime 过滤天蓝色组
- scikit-learn - 无法安装 scikit
- javascript - 如何解决:对象实例的“无法读取未定义的属性”?
- sql-server - SQL Server 客户端如何获取有关正在使用的 TLS 证书的信息?
- python - 在 Ubuntu 服务器上运行 Python3 命令时出错?
- javascript - 如何将我的 JavaScript 评估中的字符串保存在 Java 字符串中?下面的例子
- javascript - 深度过滤对象的动态数组(通过字符串属性)