Проблема с докеризацией Laravel-echo-сервера - PullRequest
1 голос
/ 04 июля 2019

У меня есть проект laravel, который должен быть упакован в контейнеры докеров. Я добавил контейнеры для PHP, MySQL, Redis и Nginx. Но laravel-echo-server не работает. Все соединения не установлены.

Моя конфигурация docker-compose.yml:

version: '3.7'
services:
  redis:
    image: redis:alpine
    container_name: wex_redis
    volumes:
      - redis_data:/data
    command: redis-server --appendonly yes
    networks:
      - wex-network

  app:
    build:
      context: ./
      dockerfile: docker/containers/app/Dockerfile
    working_dir: /app
    container_name: wex_app
    volumes:
      - ./:/app
    environment:
      - DB_PORT=3306
      - DB_HOST=database
    networks:
      - wex-network

  web:
    build:
      context: ./
      dockerfile: docker/containers/web/Dockerfile
    working_dir: /app
    container_name: wex_web
    ports:
      - 8082:80
      - 6001:6001
    networks:
      - wex-network

  database:
    image: mysql:8
    container_name: wex_db
    volumes:
      - dbdata:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=${DB_DATABASE:-wex}
      - MYSQL_ROOT_PASSWORD=root
    ports:
      - 33062:3306
    command: --default-authentication-plugin=mysql_native_password
    networks:
      - wex-network

networks:
  wex-network:
    driver: bridge

volumes:
  dbdata:
  redis_data:

"Веб" контейнер нужен для установки зависимостей npm и установки nginx. Dockerfile для веб-контейнера:

FROM node:10-alpine as build

WORKDIR /app

# Load dependencies
COPY ./package*.json ./yarn.lock ./
COPY ./webpack.mix.js ./
RUN yarn install

COPY ./resources/assets /app/resources/assets
COPY ./public/assets /app/public/assets

# Build
RUN yarn run production

# Laravel-echo-server
RUN yarn global add --prod --no-lockfile laravel-echo-server \
    && yarn cache clean

EXPOSE 6001

CMD ["laravel-echo-server", "start"]

# NGINX
FROM nginx:alpine

EXPOSE 80

COPY ./docker/containers/web/nginx.conf /etc/nginx/conf.d/default.conf
COPY ./public /app/public
COPY --from=build /app/public/assets /app/public/assets

Настройки для laravel-echo-server:

{
  "authHost": "http://localhost",
  "authEndpoint": "/broadcasting/auth",
  "clients": [],
  "database": "redis",
  "databaseConfig": {
    "redis": {},
    "sqlite": {
      "databasePath": "/database/laravel-echo-server.sqlite"
    }
  },
  "devMode": true,
  "host": null,
  "port": "6001",
  "protocol": "http",
  "socketio": {},
  "sslCertPath": "",
  "sslKeyPath": "",
  "sslCertChainPath": "",
  "sslPassphrase": "",
  "subscribers": {
    "http": true,
    "redis": true
  },
  "apiOriginAllow": {
    "allowCors": false,
    "allowOrigin": "",
    "allowMethods": "",
    "allowHeaders": ""
  }
}

Подключение к laravel-echo-серверу от js:

import Echo from 'laravel-echo'

window.io = require('socket.io-client');

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001'
});

Команда "Docker PS":

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                          NAMES
dddc2f5867b6        wex_app             "/var/entrypoint.sh …"   43 minutes ago      Up 43 minutes       9000/tcp                                       wex_app
5fb70cf7da97        wex_web             "nginx -g 'daemon of…"   19 hours ago        Up 43 minutes       0.0.0.0:6001->6001/tcp, 0.0.0.0:8082->80/tcp   wex_web
f2f331bf37e0        redis:alpine        "docker-entrypoint.s…"   7 days ago          Up 43 minutes       6379/tcp                                       wex_redis
224e2af8c151        mysql:8             "docker-entrypoint.s…"   7 days ago          Up 43 minutes       33060/tcp, 0.0.0.0:33062->3306/tcp             wex_db

Не могли бы вы спросить, когда я сделал ошибку? Почему все соединения с сервером laravel-echo не работают?

1 Ответ

0 голосов
/ 05 июля 2019

Найдите ваш Dockerfile, он использует многоэтапные сборки .

Здесь есть 2 этапа, CMD ["laravel-echo-server", "start"] только на первом этапе.Но цель многоэтапных сборок - создать финальное изображение с последней стадией.Весь предыдущий этап просто промежуточный, чтобы позволить вещам пройти последний этап.

Итак, когда ваш docker-compose запускает web service, он просто использует финальное изображение для запуска контейнера, поэтому контейнер просто вызовет ENTRYPOINT или CMD последнего этапа, который не запустится laravel-echo-server.

...