【问题标题】:Docker service laravel app not running when not running in manager node未在管理器节点中运行时,Docker 服务 laravel 应用程序未运行
【发布时间】:2018-04-05 10:18:32
【问题描述】:

docker-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. 虽然服务处于running状态,但当我查看服务日志时,我可以看到迁移仅在一个节点上成功,而在另一个节点上没有运行。 查看下面的日志

  1. 当我使 app 服务仅在 ma​​nager 节点 中运行时,应用程序运行良好。我可以登录页面并执行所有操作,但是当我仅使用副本使应用程序服务在任何节点中运行时,登录页面就会显示,但是当尝试登录时,它会重定向到 NOT FOUND 页面

这是尝试在 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

我不知道是因为迁移问题还是什么。有时我可以 登录并在几次之后我再次被重定向到未找到页面 点击仪表板内的链接。

【问题讨论】:

  • 我认为你应该限制你的 mysql 数据库的节点,因为如果这改变了它的节点,那么新的数据库将是空白的并且处于不一致的状态。数据库应该是外部的,或者它们应该固定在一个节点上。
  • @TarunLalwani 好的,我也这么认为,并尝试仅在管理器节点中运行它。但是当应用程序服务运行时,它会尝试在它运行的每个节点中迁移数据库,因为我已经添加了带有迁移命令的entrypoint。
  • 你应该有一个服务来进行迁移,它可以在任何脚本上启动,应该可以结束。您可以将其作为完整服务的一部分或作为另一个迁移服务运行
  • 使数据库运行特定节点。 (完毕)。该应用程序正在尝试在多个节点中运行迁移,而不仅仅是在添加数据库的节点中。 depends_on 应该正确完成该任务。这是我为单独运行迁移所做的一些更改。 pastebin.com/m69ChKC2
  • 那么还是有问题还是您只是显示更改?

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


【解决方案1】:

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

  • mysql中docker-compose.yml中的用户不同。这可能只是为了发布目的
  • 在您的Dockerfile 中,您使用了ENTRYPOINT,这导致相同的命令也在迁移服务上运行。我把它改成了 CMD
  • 您没有在与您的 mysql 数据库相同的网络中运行 migration 服务。因此,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:

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

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

该应用也可以正常工作

【讨论】:

  • 我遇到了这样的问题。 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”它甚至没有运行。在这两种情况下,我都遇到了问题
  • 问题是因为mysql的缓存卷容器。我建议创建一个新集群并尝试。我有类似的问题,我在play-with-docker.com 中创建了新集群并进行了测试,它可以工作。更改mysql数据容器的名称,然后重试。并像我一样保持依赖。还要确保没有缓存的图像存在
  • 如何确保它不使用来自私有仓库的缓存图像。我想它可能是从那里拉出来的,尽管我正在使用--no-cache 构建图像。我仍然被重定向到登录或用户注册时未找到的页面。我已经更新了上面的错误页面
  • 这可能是因为会话没有在节点之间共享并且它是一个应用程序问题号。这样你原来的问题就解决了
  • 它现在的工作方式以前也适用于正在解决的额外迁移问题。你确定这是APP的问题吗
猜你喜欢
  • 2020-11-17
  • 2021-12-05
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 2012-05-28
相关资源
最近更新 更多