Приложение Laravel службы Docker не работает, если оно не запущено в узле менеджера

docker-compose.yml Это мой файл docker-compose, используемый для развертывания службы в нескольких экземплярах с использованием стека docker. Как вы видите, служба app представляет собой laravel, работающий на двух узлах, и базу данных (mysql) на одном из узлов.

Полный репозиторий кода: https://github.com/taragurung/Ci-CD-docker-swarm

version: '3.4'
networks:
  smstake:   
    ipam:
      config:
        - subnet: 10.0.10.0/24

services:
    db:
        image: mysql:5.7
        networks:
          - smstake
        ports:
          - "3306"
        env_file:
          - configuration.env
        environment:
          MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
          MYSQL_DATABASE: ${DB_NAME}
          MYSQL_USER: ${DB_USER}
          MYSQL_PASSWORD: ${DB_PASSWORD}
        volumes:
          - mysql_data:/var/lib/mysql
        deploy:
          mode: replicated
          replicas: 1

    app:
        image: SMSTAKE_VERSION
        ports:
          - 8000:80
        networks:
          - smstake
        depends_on:
          - db
        deploy:
          mode: replicated
          replicas: 2

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

  1. Когда я запускаю службу приложения только в узле управления, устанавливая ограничения, приложения работают отлично. Я могу войти на страницу и делать все, но когда я запускаю службу приложения на любом узле, используя только реплики, появляется страница входа, но при попытке входа она перенаправляется на страницу НЕ НАЙДЕНА

Вот полные журналы при попытке запуска на 3 узлах. Ниже приведен пример при работе на 2 узлах. Вы можете подробно ознакомиться с проблемами миграции https://pastebin.com/wqjxSnv2

Сервисные журналы проверены с помощью docker service logs <smstake_app>

| Cache cleared successfully.
    | Configuration cache cleared!
    | Dropped all tables successfully.
    | Migration table created successfully.
    | 
    | In Connection.php line 664:
    |                                                                                
    |   SQLSTATE[42S02]: Base table or view not found: 1146 Table 'smstake.migratio  
    |   ns' doesn't exist (SQL: insert into `migrations` (`migration`, `batch`) val  
    |   ues (2014_10_12_100000_create_password_resets_table, 1))                     
    |                                                                                
    | 
    | In Connection.php line 452:
    |                                                                                
    |   SQLSTATE[42S02]: Base table or view not found: 1146 Table 'smstake.migratio  
    |   ns' doesn't exist                                                            
    |                                                                                
    | 
    | Laravel development server started: <http://0.0.0.0:80>
    | PHP 7.1.16 Development Server started at Thu Apr  5 07:02:22 2018
    | [Thu Apr  5 07:03:56 2018] 10.255.0.14:53744 [200]: /js/app.js



    | Cache cleared successfully.
    | Configuration cache cleared!
    | Dropped all tables successfully.
    | Migration table created successfully.
    | Migrating: 2014_10_12_000000_create_users_table
    | Migrated:  2014_10_12_000000_create_users_table
    | Migrating: 2014_10_12_100000_create_password_resets_table
    | Migrated:  2014_10_12_100000_create_password_resets_table
    | Migrating: 2018_01_11_235754_create_groups_table
    | Migrated:  2018_01_11_235754_create_groups_table
    | Migrating: 2018_01_12_085401_create_contacts_table
    | Migrated:  2018_01_12_085401_create_contacts_table
    | Migrating: 2018_01_12_140105_create_sender_ids_table
    | Migrated:  2018_01_12_140105_create_sender_ids_table
    | Migrating: 2018_02_06_152623_create_drafts_table
    | Migrated:  2018_02_06_152623_create_drafts_table
    | Migrating: 2018_02_21_141346_create_sms_table
    | Migrated:  2018_02_21_141346_create_sms_table
    | Seeding: UserTableSeeder
    | Laravel development server started: <http://0.0.0.0:80>
    | PHP 7.1.16 Development Server started at Thu Apr  5 07:03:23 2018
    | [Thu Apr  5 07:03:56 2018] 10.255.0.14:53742 [200]: /css/app.css

Я не знаю, связано ли это с проблемой миграции или с чем-то еще. Иногда я могу войти в систему, и через некоторое время я снова перенаправляюсь на страницу «Не найдено» при нажатии на ссылку внутри панели инструментов.

введите описание изображения здесь


person Tara Prasad Gurung    schedule 05.04.2018    source источник
comment
Я думаю, вы должны ограничить узел для своей базы данных mysql, потому что, если это изменит его узел, новая БД будет пустой и будет в несогласованном состоянии. БД должны быть либо внешними, либо закрепленными на одном узле.   -  person Tarun Lalwani    schedule 08.04.2018
comment
@TarunLalwani Хорошо, я подумал так же и попытался запустить его только в узле менеджера. Но когда служба приложений работает, она пытается перенести базу данных на каждом работающем узле, поскольку я добавил entrypoint с командами миграции.   -  person Tara Prasad Gurung    schedule 08.04.2018
comment
У вас должен быть один из сервисов, который выполняет миграцию, и его можно запустить в любом скрипте, и он должен завершиться нормально. Вам решать, запускать ли это как часть полного сервиса или как еще один сервис миграции.   -  person Tarun Lalwani    schedule 08.04.2018
comment
Заставить базу данных запускать определенный узел. (Выполнено). Приложение пытается выполнить миграцию на нескольких узлах, а не только на узле, куда добавляется база данных. depends_on должен был выполнить эту задачу правильно. Вот несколько изменений, которые я сделал, чтобы выполнить миграцию отдельно. pastebin.com/m69ChKC2   -  person Tara Prasad Gurung    schedule 08.04.2018
comment
Так все еще есть проблема или вы просто показываете изменения?   -  person Tarun Lalwani    schedule 08.04.2018
comment
@TarunLalwani пытается запустить команду миграции для каждого экземпляра. и соответственно ошибка. Планирование обнаружения экземпляра перед запуском команды миграции   -  person Tara Prasad Gurung    schedule 08.04.2018
comment
Давайте продолжим это обсуждение в чате.   -  person Tarun Lalwani    schedule 08.04.2018


Ответы (1)


Поэтому я запустил ваш сервис и обнаружил несколько проблем.

  • Пользователь в docker-compose.yml в mysql был другим. Хотя, возможно, это было просто для публикации
  • В вашем Dockerfile вы использовали ENTRYPOINT, что привело к запуску той же команды и в службе миграции. Я изменил его на CMD
  • Вы не запускали службу migration в той же сети, что и ваша база данных mysql. Таким образом, mysql не был доступен из того же.

Это окончательный файл компоновки, который я использовал

docker-compose.yml

version: '3.4'

networks:
  smstake:


services:
    db:
        image: mysql:5.7
        networks:
          - smstake
        ports:
          - "3306"
        environment:
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: smstake
          MYSQL_USER: tara
          MYSQL_PASSWORD: password
        volumes:
          - mysql_data:/var/lib/mysql
        deploy:
          mode: replicated
          replicas: 1
          placement:
            constraints:
              - node.role == manager


    app:
        image: 127.0.0.1:5000/myimage:latest
        ports:
          - 8000:80
        networks:
          - smstake
        depends_on:
          - db
          - migration
        deploy:
          mode: replicated
          replicas: 3

    migration:
        image: 127.0.0.1:5000/myimage:latest
        command: sh -xc "sleep 10 && pwd && php artisan migrate:fresh 2>&1"
        networks:
          - smstake
        depends_on:
          - db
        deploy:
          restart_policy:
            condition: on-failure
          mode: replicated
          replicas: 1
          placement:
            constraints:
              - node.role == manager


volumes:
    mysql_data:

Файл Docker

FROM alpine

ENV \
  APP_DIR="/project" \
  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

RUN mkdir /apps
COPY ./project /apps
RUN cd /apps && composer install

WORKDIR /apps

RUN chmod -R 775 storage
RUN chmod -R 775 bootstrap

copy ./run.sh /tmp
CMD ["/tmp/run.sh"]

А потом снова запустил службу. Тогда миграция прошла нормально

Миграция

И приложение тоже работало

Приложение работает

person Tarun Lalwani    schedule 10.04.2018
comment
Я в таких вопросах. smstake_migration.1.v2vqeq4nqzwb | In Connection.php line 664: | | SQLSTATE[HY000] [2002] Operation timed out (SQL: SHOW FULL TABLES WHERE tab | le_type = 'BASE TABLE') Я сделал так, чтобы служба миграции зависела от службы приложений, если она зависит от «db», она даже не работает. В обоих случаях у меня возникли проблемы - person Tara Prasad Gurung; 10.04.2018
comment
Проблема связана с контейнером кэшированных томов mysql. Я бы предложил создать новый кластер и попробовать. У меня была аналогичная проблема, и я создал новый кластер в play-with-docker.com и проверил, и он работает. . Измените имя контейнера данных mysql и повторите попытку. И сохранить зависимость, как я сделал. Также убедитесь, что кешированные изображения отсутствуют. - person Tarun Lalwani; 10.04.2018
comment
Как убедиться, что он не использует кешированное изображение из частного репо. Я предполагаю, что это может быть оттуда, хотя я создаю образ с помощью --no-cache. Меня по-прежнему перенаправляют на ненайденную страницу при входе в систему или регистрации пользователя. Я обновил страницу с ошибкой выше - person Tara Prasad Gurung; 10.04.2018
comment
Это может происходить из-за того, что сеанс не распределяется между узлами, и это проблема приложения №. Итак, ваша первоначальная проблема решена - person Tarun Lalwani; 10.04.2018
comment
То, как это работает сейчас, также работало ранее с дополнительной проблемой миграции, которая решается. Вы уверены, что это проблема с приложением? - person Tara Prasad Gurung; 10.04.2018
comment
Если я не ошибаюсь, это может быть связано с тем, что сеанс не используется всеми узлами. Дайте мне знать, если вы найдете полное решение, которое сейчас принимает ваши ответы. Большое спасибо - person Tara Prasad Gurung; 10.04.2018
comment
Вы используете SESSION_DRIVER=file, который не может работать в кластерном режиме? Попробуйте использовать database сейчас, и это должно решить проблему. - person Tarun Lalwani; 10.04.2018
comment
Это не помогло изменить тип SESSION_DRIVER. - person Tara Prasad Gurung; 10.04.2018
comment
Давайте продолжим это обсуждение в чате. - person Tarun Lalwani; 10.04.2018