前提・実現したいこと
dockerでLaravelの環境を作っているものです。
現在は
- PHPの環境
- Laravelの環境(プロジェクト生成→初期ページ確認)
が完了しています。
この状態で、初期のマイグレーションファイルをマイグレートしようとすると(php artisan migrate)、
下記のエラーが出てしまいます。
どのように対処すればよろしいでしょうか。
ご回答のほど、よろしくお願いいたします。
エラー
Illuminate\Database\QueryException : SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432? (SQL: select * from information_schema.tables where table_schema = public and table_name = migrations and table_type = 'BASE TABLE') at /work/vendor/laravel/framework/src/Illuminate/Database/Connection.php:670 666| // If an exception occurs when attempting to run a query, we'll format the error 667| // message to include the bindings with SQL, which will make this exception a 668| // lot more helpful to the developer instead of just the database's errors. 669| catch (Exception $e) { > 670| throw new QueryException( 671| $query, $this->prepareBindings($bindings), $e 672| ); 673| } 674| Exception trace: 1 PDOException::("SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432?") /work/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:69 2 PDO::__construct("pgsql:host=127.0.0.1;dbname=test_db;port=5432;sslmode=prefer", "test_user", "test1234", []) /work/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:69 Please use the argument -v to see more details.
該当のソースコード
DBコンテナ
dbコンテナに入り、test_userでtest_dbに入ることはできています...。
sh
1[xxxxMBP]$ docker-compose exec db sh [Laravel_Turtorial]+[master] 2# psql -U test_user test_db 3psql (10.6 (Debian 10.6-1.pgdg90+1)) 4Type "help" for help. 5 6test_db=> select * from test_table; 7 id | name | age 8....
####Dockerfile
Dockerfile
1#ベースイメージの指定 2FROM php:7.3-fpm-alpine 3 4ARG TZ 5ENV COMPOSER_ALLOW_SUPERUSER 1 6ENV COMPOSER_HOME /composer 7 8RUN set -eux && \ 9 apk update && \ 10 apk add --update-cache --no-cache --virtual=.build-dependencies tzdata && \ 11 cp -r /usr/share/zoneinfo/${TZ} /etc/localtime && \ 12 apk del .build-dependencies && \ 13 apk add --update-cache --no-cache postgresql-dev && \ 14 docker-php-ext-install bcmath pgsql pdo_pgsql && \ 15 curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer && \ 16 composer config -g repos.packagist composer https://packagist.jp && \ 17 composer global require hirak/prestissimo
####docker-compose.ymlで使用する環境変数を定義した.envファイル
env
1DB_NAME=test_db 2DB_USER=test_user 3DB_PASS=test1234 4TZ=Asia/Tokyo
####docker-compose.yml
yml
1version: "3" 2#アプリケーションを動かすための各要素(サービス) 3services: 4 db: 5 image: postgres:10.6 6 container_name: db 7 environment: 8 TZ: 'Asia/Tokyo' 9 POSTGRES_USER: ${DB_USER} 10 POSTGRES_PASSWORD: ${DB_PASS} 11 POSTGRES_DB: ${DB_NAME} 12 volumes: 13 - ./docker/db/data:/var/lib/postgresql/data 14 - ./docker/db/sql:/docker-entrypoint-initdb.d 15 ports: 16 - 10032:5432 17 app: 18 build: 19 context: ./docker/php 20 args: 21 - TZ=${TZ} #Dockerfileで使用するタイムゾーンの設定 22 volumes: 23 - ./src:/work 24 - ./logs:/var/log/php 25 - ./docker/php/php.ini:/usr/local/etc/php/php.ini 26 working_dir: /work 27 environment: 28 #Laravel設定用の環境変数 29 - DB_CONNECTION=pgsql 30 - DB_HOST=127.0.0.1 31 - DB_DATABASE=${DB_NAME} 32 - DB_USERNAME=${DB_USER} 33 - DB_PASSWORD=${DB_PASS} 34 - TZ=${TZ} #php.iniで使用するタイムゾーンの設定 35 web: 36 image: nginx:1.17-alpine 37 depends_on: 38 - app 39 ports: 40 - 7979:80 41 volumes: 42 - ./src:/work 43 - ./logs:/var/log/nginx 44 - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf 45 environment: 46 - TZ=${TZ}
####Laravelプロジェクト作成時に生成された.envファイル
env
1... 2APP_URL=http://127.0.0.1 3 4LOG_CHANNEL=stack 5 6DB_CONNECTION=pgsql 7DB_HOST=127.0.0.1 8DB_PORT=5432 9DB_DATABASE=test_db 10DB_USERNAME=test_user 11DB_PASSWORD=test1234 12...
試したこと
- postmaster.pidを削除
- ポート番号変更
補足情報(FW/ツールのバージョンなど)
Macを使用
追加質問
ホスト側の.envファイルとdocker-compose.yml、コンテナ側の.envファイルを弄ったら解決しました...。
具体的にはホスト側の.envファイルに
env
1DB_HOST=db //追加(postgresではダメだった) 2DB_NAME=test_db 3DB_USER=test_user 4DB_PASS=test1234 5TZ=Asia/Tokyo
DB_HOSTを指定し、
docker
1 app: 2 build: 3 context: ./docker/php 4 args: 5 - TZ=${TZ} #Dockerfileで使用するタイムゾーンの設定 6 volumes: 7 - ./src:/work 8 - ./logs:/var/log/php 9 - ./docker/php/php.ini:/usr/local/etc/php/php.ini 10 working_dir: /work 11 environment: 12 #Laravel設定用の環境変数 13 - DB_CONNECTION=pgsql 14 - DB_HOST=${DB_HOST} 15 - DB_DATABASE=${DB_NAME} 16 - DB_USERNAME=${DB_USER} 17 - DB_PASSWORD=${DB_PASS} 18 - TZ=${TZ} #php.iniで使用するタイムゾーンの設定
environmentでDB_HOSTに指定する。
そして、コンテナ側の.envファイルで
env
1DB_CONNECTION=pgsql 2DB_HOST=${DB_HOST} 3DB_PORT=5432 4DB_DATABASE=test_db 5DB_USERNAME=test_user 6DB_PASSWORD=test1234
ホストで使えるようにしたDB_HOSTを指定する。
このようにすれば、マイグレートできました。
sh
1[xxxx]$ docker-compose exec app ash [Laravel_Turtorial]+[master] 2/work # php artisan migrate 3Nothing to migrate.
ただ、どうしてできたのかがまだイマイチ理解できていません。
もしよろしければ、下の3つの追加質問にお答えいただけませんでしょうか。
よろしくお願いいたします。
① そもそも、「docker-compose.ymlのenvironmentに指定した変数は、環境変数として他のファイルから参照できるようになる」という認識で合っているのか
② ①の認識で合っているのだとしたら、docker-compose.ymlのdbとappに同じような記述(environmentでデータベース関連の情報を渡している)をする必要はないのか
docker
1services: 2 db: 3 ... 4 container_name: db 5 environment: 6 TZ: 'Asia/Tokyo' 7 POSTGRES_USER: ${DB_USER} 8 POSTGRES_PASSWORD: ${DB_PASS} 9 POSTGRES_DB: ${DB_NAME} 10 ... 11 app: 12 ... 13 environment: 14 #Laravel設定用の環境変数 15 - DB_CONNECTION=pgsql 16 - DB_HOST=${DB_HOST} 17 - DB_DATABASE=${DB_NAME} 18 - DB_USERNAME=${DB_USER} 19 - DB_PASSWORD=${DB_PASS} 20 - TZ=${TZ} #php.iniで使用するタイムゾーンの設定
③ ホスト側の.envのDB_HOSTに、dbではなくpostgresと記述したら下記のようなエラーが発生したが、それはなぜか
Illuminate\Database\QueryException : SQLSTATE[08006] [7] could not translate host name "postgres" to address: Name does not resolve (SQL: select * from information_schema.tables where table_schema = public and table_name = migrations and table_type = 'BASE TABLE') at /work/vendor/laravel/framework/src/Illuminate/Database/Connection.php:670 666| // If an exception occurs when attempting to run a query, we'll format the error 667| // message to include the bindings with SQL, which will make this exception a 668| // lot more helpful to the developer instead of just the database's errors. 669| catch (Exception $e) { > 670| throw new QueryException( 671| $query, $this->prepareBindings($bindings), $e 672| ); 673| } 674| Exception trace: 1 PDOException::("SQLSTATE[08006] [7] could not translate host name "postgres" to address: Name does not resolve") /work/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:69 2 PDO::__construct("pgsql:host=postgres;dbname=test_db;port=5432;sslmode=prefer", "test_user", "test1234", []) /work/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:69 Please use the argument -v to see more details.
④ docker-compose.ymlのportsには「ホスト側のポート番号:コンテナ側のポート番号」を指定するが、ホスト側のポート番号は適当に当てられるのに対して、コンテナ側のポート番号は「5432」で固定なのでしょうか(左側は自由に当てられ、3306などにするとエラーが発生した)。
⑤コンテナ側のポート番号が固定だったとして、コンテナ側の.envファイルに定義するDB_PORTとも必ず合わせる必要があるのでしょうか(またはDB_PORTの定義は必ずしないといけないのか)。
yml
1 db: 2 image: postgres:10.6 3 container_name: db 4 environment: 5 TZ: 'Asia/Tokyo' 6 POSTGRES_USER: ${DB_USER} 7 POSTGRES_PASSWORD: ${DB_PASS} 8 POSTGRES_DB: ${DB_NAME} 9 volumes: 10 - ./docker/db/data:/var/lib/postgresql/data 11 - ./docker/db/sql:/docker-entrypoint-initdb.d 12 ports: 13 - 10090:5432 //ここの左は固定?