簡體   English   中英

Dockerize adonis.js + mysql

[英]Dockerize adonis.js + mysql

我正在嘗試通過 docker-compose 對接現有的 adonis.js 應用程序和 MySQL。

這是我的 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"]

這是我的 docker-compose.yml 文件

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 容器說應用程序正在運行,但我無法訪問它,我總是得到:

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 設置和不同的 dockerfile,幾乎總是一切正常,但我無法訪問服務器。 還嘗試了不同的 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

在這個設置中有兩件事跳出來。

首先,當容器啟動打印時:

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

這通常表明配置問題會使進程無法訪問。 在 Docker 中,每個容器都有自己的localhost接口,因此“偵聽 127.0.0.1”的進程只能從容器私有 localhost 接口訪問,但不能從其他容器或主機訪問(無論您擁有什么ports:選項)。 您通常需要將進程設置為“綁定”或“偵聽”到特殊的 0.0.0.0 全接口地址。

在 Adonis 中,這看起來是由$HOST環境變量控制的 Adonis 模板將此設置為 127.0.0.1 Adonis 將自己記錄為使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM