【发布时间】: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状态,但当我查看服务日志时,我可以看到迁移仅在一个节点上成功,而在另一个节点上没有运行。 查看下面的日志
- 当我使 app 服务仅在 manager 节点 中运行时,应用程序运行良好。我可以登录页面并执行所有操作,但是当我仅使用副本使应用程序服务在任何节点中运行时,登录页面就会显示,但是当尝试登录时,它会重定向到 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