未在管理器节点中运行时,Docker服务laravel应用程序未运行

时间:2018-04-05 10:18:33

标签: docker docker-compose laravel-5.3 docker-swarm docker-stack

搬运工-compose.yml 这是我的docker-compose文件,用于使用docker-stack在多个实例中部署服务。您可以看到 app 服务,它是在2个节点中运行的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. 当我只在经理节点中运行应用服务时,限制应用效果很好。我可以登录页面并执行所有操作,但是当我使用复制品在任何节点中运行应用程序服务时,登录页面显示但是当尝试登录时重定向到 NOT FOUND页面
  2. 尝试在3个节点上运行时,这是完整日志。 Bellow是在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
    
      

    我不知道它是否由于迁移问题或者是什么原因造成的。我有时可以   登录,几次后我再次被重定向到Not found页面   点击仪表板内的链接。

    enter image description here

1 个答案:

答案 0 :(得分:5)

所以我运行了你的服务,发现了一些问题。

  • mysql中docker-compose.yml的用户不同。这可能仅仅是用于发布目的
  • 在您的Dockerfile中,您使用了ENTRYPOINT,导致同样的命令也在迁移服务上运行。我把它改成了CMD
  • 您没有在与mysql数据库相同的网络中运行migration服务。因此mysql无法从同一地点访问。

这是我使用的最终撰写文件

<强>搬运工-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:

<强> Dockerfile

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"]

然后再次运行该服务。然后迁移顺利

Migration

该应用程序也工作

App Working