泊坞窗,compose.yml
这是我的docker-compose文件,用于使用docker-stack在多个实例中部署服务.正如您所看到的那样,应用程序服务是在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.虽然在检查服务日志时服务处于运行状态,但我可以看到仅在一个节点中成功迁移而在另一个节点中没有运行.请参阅下面的日志
>当我使应用程序服务仅在管理器节点中运行限制时,应用程序运行良好.我可以登录页面并执行所有操作但是当我使用复制品在任何节点中运行应用程序服务时,登录页面显示但是当尝试登录时重定向到NOT FOUND页面
尝试在3个节点上运行时,这是完整日志. Bellow是在2个节点上运行时的示例.您可以详细了解迁移问题
https://pastebin.com/wqjxSnv2
使用泊坞窗服务日志检查服务日志< 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:
I don’t know if its due to migration problem or what. Sometime I can
login and after few time I get redirected to Not found page again when
clicking on the link inside dashboard.

所以我运行了你的服务,发现了一些问题.
> mysql中docker-compose.yml中的用户不同.这可能仅仅是为了发布目的
>在Dockerfile中,您使用了ENTRYPOINT,这也导致在迁移服务上运行相同的命令.我把它改成了CMD
>您没有在与mysql数据库相同的网络中运行迁移服务.所以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"]
然后再次运行该服务.然后迁移就好了

该应用程序也工作
