Отказ в соединении во время миграции внутри Docker в Laravel 5.8 - PullRequest
0 голосов
/ 17 апреля 2019

Я не могу выполнить миграцию во время сборки докера.

Я пробовал

докер-compose.yml

version: '3'
services:
  portalmodules:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8011:8000
    links:
      - database
  database:
    image: postgres:11.2
    ports:
    - "5432:5432"
    expose:
    - "5432"
    environment:
      - "POSTGRES_PASSWORD=12345"
      - "POSTGRES_USER=john"
      - "POSTGRES_DB=api"

Dockerfile

FROM composer:1.8.5 as build_stage

COPY . /src
WORKDIR /src
RUN composer install

FROM alpine:3.8
RUN apk --no-cache add \
php7 \
php7-mbstring \
php7-session \
php7-openssl \
php7-tokenizer \
php7-json \
php7-pdo \
php7-pdo_pgsql \
php7-pgsql

COPY --from=build_stage /src  /src
RUN ls -al
RUN set -x \
addgroup -g 82 -S www-data \
adduser -u 82 -D -S -G www-data www-data

WORKDIR /src
RUN ls -al
RUN chmod -R 777 storage
RUN chmod +x run.sh
RUN cp run.sh /tmp
ENTRYPOINT ["/tmp/run.sh"]

run.sh

#!/bin/sh

php artisan migrate:fresh --seed
php artisan serve --host=0.0.0.0

.env

APP_NAME=API
APP_ENV=local
APP_KEY=base64:Qa3U2oP5IQ93MGEJu61MrcQFRSsS5vQRWUrqYwIplEo=
APP_DEBUG=true
APP_URL=http://1.1.1.1
#---------------------------------------------- DATABASE
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=api
DB_USERNAME=john
DB_PASSWORD=12345

Я пробовал 3 значения разности DB_HOST localhost, 127.0.0.1, database

Я продолжал получать

enter image description here

Как можно пойти дальше и отладить это?

1 Ответ

1 голос
/ 17 апреля 2019

Правильным DB_HOST является database, поскольку каждый контейнер имеет свой собственный IP-адрес, поэтому ваша база данных не находится в localhost приложения.

Обратите внимание, что вы запускаете базу данных и приложение laravel одновременно, поэтому база данных может все еще инициализироваться, после чего выполняется миграция, и она не может подключиться, потому что слишком рано подключаться к базе данных.

У вас есть несколько вариантов: дождаться готовности базы данных, прежде чем запускать миграцию, повторить миграцию, пока она не завершится успешно, или запустить команду миграции из другой службы, используя тот же образ, что и приложение laravel (и задав restart: on-failure, чтобы контейнер миграции перезапускается, пока не выполнит успешную миграцию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...