Докеризируйте адониса. js + mysql - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь докеризовать существующее приложение adonis. js и MySQL через docker -compose.

Вот мой Dockerfile

FROM node:12.18.2-alpine3.9

ENV HOME=/app
RUN mkdir /app

COPY package.json $HOME

WORKDIR $HOME
RUN npm i -g @adonisjs/cli && npm install

CMD ["npm", "start"]

И вот my docker -compose.yml file

version: '3'

services:
  adonis-mysql:
    image: mysql:5.7
    ports:
      - '3307:3306'
    volumes:
      - $PWD/data:/var/lib/mysql
    environment:
      MYSQL_USER: ${DB_USER}
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ALLOW_EMPTY_PASSWORD: ${DB_ALLOW_EMPTY_PASSWORD}
    networks:
      - api-network
  adonis-api:
    container_name: "${APP_NAME}-api"
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/app
      - /app/node_modules
    ports:
      - "3333:3333"
    depends_on:
      - adonis-mysql
    networks:
      - api-network

networks:
  api-network:

При запуске docker-compose up все идет гладко, и контейнер adonis-api сообщает, что приложение запущено, но я не могу до него добраться, я всегда get:

This site can’t be reached
127.0.0.1 refused to connect.

или

This site can’t be reached
The connection was reset.

Я пробовал с разными настройками docker -compose и разными dockerfiles, почти всегда все запускается нормально, но я просто не могу получить доступ к сервер. Также пробовал разные IP и порты, но все равно ничего.

Журналы контейнера:

testProject-api | 
testProject-api | > adonis-fullstack-app@4.1.0 start /app
testProject-api | > node server.js
testProject-api | 
adonis-mysql_1  | 2020-07-09T09:56:35.960082Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
testProject-api | info: serving app on http://127.0.0.1:80

docker ps

dan@dan-Nitro-AN515-54:~/Documents/Tests/testProject$ docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                               NAMES
45f3dd21ef93        testproject_adonis-api   "docker-entrypoint.s…"   20 seconds ago      Up 19 seconds       0.0.0.0:3333->3333/tcp              testProject-api
7b40bc7c75c3        mysql:5.7                "docker-entrypoint.s…"   2 minutes ago       Up 20 seconds       33060/tcp, 0.0.0.0:3307->3306/tcp   testproject_adonis-mysql_1

1 Ответ

0 голосов
/ 09 июля 2020

В этой настройке проявляются две особенности.

Прежде всего, при запуске контейнера выводится:

info: serving app on http://127.0.0.1:80

Обычно это указывает на проблему с конфигурацией, из-за которой процесс недоступен. В Docker каждый контейнер имеет свой собственный интерфейс localhost, поэтому процесс, который «слушает 127.0.0.1», будет доступен только из частного интерфейса локального хоста контейнера, но не из других контейнеров или хоста (независимо от того, что ports: вариантов у вас есть). Обычно вам нужно настроить процессы на «привязку» или «прослушивание» специального адреса всех интерфейсов 0.0.0.0. 1012 *; шаблоны Adonis устанавливают это значение 127.0.0.1 . Адонис документирует себя как использующий dotenv библиотеку , и это, в свою очередь, дает приоритет переменным среды над .env файлом , поэтому этого должно быть достаточно, чтобы установить переменную среды HOST=0.0.0.0.

(Ни один из предыдущих абзацев не обсуждается в документации Adonis!)

Вторая вещь в этом сообщении об ошибке заключается в том, что второе число в ports: должно соответствовать порту номер, который использует процесс контейнера. Похоже, что все шаблоны Adonis по умолчанию используют порт 3333, но в этом стартовом сообщении указано, что порт 80, поэтому вам нужно изменить ports: на порт 80 с правой стороны. Вы можете выбрать любой порт для левой стороны.

Добавив некоторые стандартные процедуры очистки, вы можете заменить свой сервисный блок docker-compose.yml на:

adonis-api:
  build: .          # context directory only; use default Dockerfile
  environment:
    - HOST=0.0.0.0  # listen on all interfaces
  ports:
    - "3333:80"     # matches actual listener message
  depends_on:
    - adonis-mysql
  # Use "default" network (also delete other networks: blocks in the file)
  # Use Compose default container name
  # Use code from the Docker image; don't overwrite with volumes
  # (and don't tell Docker to use arbitrarily old node_modules)
...