実現したいこと
herokuにdockerでローカル開発環境を作ったlaravelのapiをデプロイする
前提
技術構成
バックエンド:laravel
フロントエンド:Nextjs
DB:MySQL
の構成でレビューを投稿する様なwebアプリを作っています。
それぞれDockerfileで開発環境を構築、githubのリポジトリを分けて管理しています。
ローカル開発環境ではブラウザでの動作確認はできています。
herokuでMySqlを使うためにherokuのアドオンでjawsDBを追加しています
発生している問題・エラーメッセージ
問題としては、herokuのcontainer registoryにイメージをアップしそれを元にデプロイしようと試みていますが、その際に下記の画像の様にデプロイが動作していない様です(urlは隠しています)
フォルダ構成
rootフォルダ名は仮のものです。
laravel-root
┣laravel関連ファイル
┣ docker
┃ ┗php
┃ ┣ apache
┃ ┃ ┗ 000-default.conf
┃ ┣ Dcokerfile(これはローカル環境用です)
┃ ┗ php.ini
┣ .env
┣ composer.json
┣ composer.lock
┣ Dockerfile(デプロイで使う本番用Dockerfile)
┣ docker-compose.yml
┣ docker-compose.develop.yml(ローカル環境でのymlファイル)
┣ docker-compose.production.yml
┃ (デプロイ用のDockerfileをローカルで確認用)
┣ Procfile
・
・
フォルダの構成概要:
・ローカル環境ではdocker/php/Dockerfileをlaravel-rootのdocker-compose.ymlにdocker-compose.develop.ymlに記載したローカル用のコードをコピーして動作させています。ローカルではlaravel apiは正常に動作しフロントのnextjsとのやりとりも問題ありません。
・本番へのデプロイではlaravel-rootのDockerfileをデプロイ用で用意し、それをheorku container registoryにpushする形にしています。
以下デプロイの際に流したコマンドとエラー文です
laravel-root階層で行なっています
個人情報などの部分は[隠し]に置き換えています
デプロイの際に流しているコマンド
docker build -t strii-api-heroku:strii-api-heroku .
heroku container:push strii-api-heroku -a strii-api
heroku container:release strii-api-heroku -a strii-api
heroku open (ここで添付画像の様にエラーとなります)
heroku logsコマンドでのエラー文
heroku
12024-01-30T10:53:48.440525+00:00 app[api]: Deployed strii-api-heroku (71266796715f) by user [隠し] 22024-01-30T10:53:48.440525+00:00 app[api]: Release v15 created by user [隠し] 32024-01-30T10:54:08.840223+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/" host=[隠し] request_id=23f3100e-a124-4af4-b926-7d9bdfd9d5e6 fwd="36.14.1.24" dyno= connect= service= status=503 bytes= protocol=https 42024-01-30T10:54:09.099891+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=[隠し] request_id=f04b12ea-c301-44b3-84bd-43aeda618770 fwd="36.14.1.24" dyno= connect= service= status=503 bytes= protocol=https
エラーの状態としては、herokuのdynoが立ち上がっていない様です。
heroku open で添付画像の様になり、
heroku psでプロセスを確認すると
heroku
1>>>heroku ps 2No dynos on ⬢ strii-api
となっており、
heroku container:release strii-api-heroku -a strii-apiを実行した時点でheroku psで確認しても上記の様にdynoが立ち上がっていない状態です
該当のソースコード
Dockerfile(本番環境用)
1# ・このDockerファイルはheroku container registoryにpushするイメージをbuildする本番環境用 2# のDockerfileである。 3# ・ローカル開発環境ではこのファイルは不要であるので注意されたし。 4# ・./docker/php/に作成したかったが 5# COPY . /var/www/html/strii-backendのCopy句が 6# 想定通りにコピーされないためこの階層に作成している 7 8FROM php:8.2-apache 9 10WORKDIR /var/www/html 11 12RUN apt-get update \ 13 && apt-get -y install libicu-dev libonig-dev libzip-dev unzip locales vim zlib1g-dev libpng-dev libjpeg-dev libfreetype6-dev libwebp-dev \ 14 && apt-get clean \ 15 && rm -rf /var/lib/apt/lists/* \ 16 && locale-gen en_US.UTF-8 \ 17 && localedef -f UTF-8 -i en_US en_US.UTF-8 \ 18 && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ 19 && docker-php-ext-install intl pdo_mysql zip bcmath gd exif \ 20 && a2enmod rewrite 21 22ENV \ 23 LANG=en_US.UTF-8 \ 24 LANGUAGE=en_US:en \ 25 LC_ALL=en_US.UTF-8 26 27COPY . /var/www/html/strii-backend 28 29# publicフォルダとstorageフォルダのパーミッションを設定 30RUN chown -R www-data:www-data /var/www/html/strii-backend/public /var/www/html/strii-backend/storage 31RUN chmod -R 775 /var/www/html/strii-backend/public /var/www/html/strii-backend/storage 32 33COPY --from=composer:2.5 /usr/bin/composer /usr/bin/composer 34 35# 各種設定ファイルをコンテナの設定ファイルにコピー 36COPY ./docker/php/php.ini /usr/local/etc/php/ 37COPY ./docker/php/apache/000-default.conf /etc/apache2/sites-enabled/000-default.conf 38 39# EXPOSE 80 40# heroku用に$PORTを使っている。ローカルで確認する時はコメントアウトすること 41# EXPOSE $PORT 42 43 44CMD ["/bin/sh", "-c", "apache2-foreground"] 45
下記のdocker-compose.ymlの内容は前述してある本番デプロイ用のDockerfileの動作をローカルで確認するために作成しています。ローカルでは動作しました。
dockerーcompose.yml(dockerーcompose.production.ymlをコピーしたもの)
1version: '3.8' 2 3services: 4 web_backend: 5 build: . 6 container_name: web_backend 7 tty: true 8 stdin_open: true 9 ports: 10 - 80:80 11 depends_on: 12 - db 13 db: 14 image: mysql:8.2 15 container_name: db 16 environment: 17 MYSQL_ROOT_PASSWORD: root 18 MYSQL_DATABASE: strii_db 19 MYSQL_USER: [隠し] 20 MYSQL_PASSWORD: [隠し] 21 TZ: 'Asia/Tokyo' 22 volumes: 23 - ./docker/db/data:/var/lib/mysql 24 - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf 25 ports: 26 - 3306:3306
以下、herokuが使うProcfileです
Procfile
1web: vendor/bin/heroku-php-apache2 strii-backend/public/
以下、heroku configコマンドの結果の環境変数などです
=== strii-api Config Vars DB_CONNECTION: mysql DB_DATABASE: [隠し] DB_HOST: [隠し] DB_PASSWORD: [隠し] DB_PORT: 3306 DB_USERNAME: [隠し] JAWSDB_URL: mysql:〜〜:3306/〜〜
以下、heroku stackコマンドの結果です
>>>heroku stack === ⬢ strii-api Available Stacks * container heroku-20 heroku-22
念の為、ローカル開発環境用で使ったdocker/php/Dockerfile、docker-compose.ymlも載せておきます。正常に動作しております。
docker/php/Dockerfile
1FROM php:8.2-apache 2 3RUN apt-get update \ 4 && apt-get -y install git libicu-dev libonig-dev libzip-dev unzip locales vim zlib1g-dev libpng-dev libjpeg-dev libfreetype6-dev libwebp-dev \ 5 && apt-get clean \ 6 && rm -rf /var/lib/apt/lists/* \ 7 && locale-gen en_US.UTF-8 \ 8 && localedef -f UTF-8 -i en_US en_US.UTF-8 \ 9 && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ 10 && docker-php-ext-install intl pdo_mysql zip bcmath gd exif \ 11 && pecl install xdebug \ 12 && docker-php-ext-enable xdebug \ 13 && a2enmod rewrite 14 15ENV \ 16 LANG=en_US.UTF-8 \ 17 LANGUAGE=en_US:en \ 18 LC_ALL=en_US.UTF-8 19 20COPY /usr/bin/composer /usr/bin/composer 21 22# 各種設定ファイルをコンテナの設定ファイルにコピー 23COPY php.ini /usr/local/etc/php/ 24COPY apache/000-default.conf /etc/apache2/sites-enabled/000-default.conf 25 26WORKDIR /var/www/html
dockerーcompose.yml(ローカル開発用)
1version: '3.8' 2 3services: 4 web_backend: 5 build: ./docker/php 6 container_name: web_backend 7 tty: true 8 stdin_open: true 9 ports: 10 - 80:80 11 volumes: 12 - ./:/var/www/html/strii-backend 13 - ./docker/php/php.ini:/usr/local/etc/php/php.ini 14 - ./docker/php/apache/000-default.conf:/etc/apache2/sites-enabled/000-default.conf 15 depends_on: 16 - db 17 db: 18 image: mysql:8.2 19 container_name: db 20 environment: 21 MYSQL_ROOT_PASSWORD: root 22 MYSQL_DATABASE: strii_db 23 MYSQL_USER: trainer 24 MYSQL_PASSWORD: trainer 25 TZ: 'Asia/Tokyo' 26 volumes: 27 - ./docker/db/data:/var/lib/mysql 28 - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf 29 ports: 30 - 3306:3306 31
※回答で指摘していただいたheroku.ymlの追記※
コメントアウトの部分は適宜試した部分で、最終的に下記のコードとなっています。build句の部分のみ使用
heroku.yml
1# setup: 2# addons: 3 # config: 4 # APP_KEY: = 5 # APP_ENV: production # アプリケーションの環境 6 # APP_DEBUG: true # デバッグモードを無効にする 7build: 8 docker: 9 web: Dockerfile 10 # config: 11 # APP_NAME: Laravel 12 # APP_DEBUG: true 13 # APP_KEY: base64〜 14 # DB_CONNECTION: mysql 15 # DB_DATABASE: 〜 16 # DB_HOST: 〜 17 # DB_PASSWORD: 〜 18 # DB_PORT: 3306 19 # DB_USERNAME: 〜 20# release: 21# run: 22 # web: php artisan serve --port $PORT 23 # web: heroku-php-apache2 public/ 24 # web: heroku-php-apache2 strii-backend/public/ 25
試したこと
やったことしてはchatGptを使いながら前述してきたイメージのbuildとheroku container registoryにpushするあたりまで動作するところまで出来ました。
現状herokuのdynoが立ち上がらないもしくは、立ち上がってもすぐに終了しているのが原因でどうやってdynoを立ち上がる様にするのかがわかっていません。
何日もデプロイできない状態が続いているので、herokuに詳しい方、分かる方がいましたら回答していただけると幸いです。
追加コードが必要な場合は指摘していただければ再度アップいたします。
補足情報(FW/ツールのバージョンなど)
laravel :9系
php: ^8.0.2
mysql:8.2
Docker: 20.10.24
Docker desctop: 4.18.0
Docker Compose v2.17.2
heroku/8.7.1 darwin-x64 node-v16.19.0
PC: mac book pro 13 inch 2020 intel
macOS: Monterey v12.5

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/01/31 17:24 編集
2024/02/01 04:39