Dockerize adonis.js + mysql

Posted

技术标签:

【中文标题】Dockerize adonis.js + mysql【英文标题】: 【发布时间】:2020-10-29 21:40:17 【问题描述】:

我正在尝试通过 docker-compose 对现有的 adonis.js 应用和 mysql 进行 dockerize。

这是我的 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

码头工人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】:

在这个设置中有两件事跳出来。

首先,当容器启动时打印:

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

这通常表明存在导致进程无法访问的配置问题。在 Docker 中,每个容器都有自己的 localhost 接口,因此“监听 127.0.0.1”的进程只能从容器私有 localhost 接口访问,而不能从其他容器或主机访问(不管 ports: 是什么)您拥有的选项)。您通常需要将进程设置为“绑定”或“侦听”到特殊的 0.0.0.0 全接口地址。

在 Adonis 中,它看起来像 this is controlled by the $HOST environment variable; Adonis 模板set this to 127.0.0.1。阿多尼斯documents itself as using the dotenv library,然后又是gives precedence to environment variables over the .env file,所以设置一个环境变量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)

【讨论】:

天哪,谢谢!就是这样。我花了两天时间解决这个问题。谢谢。 大卫,一切正常,但后来我将所有与 docker 相关的东西移到了一个专用文件夹,现在我无法再连接到 MySQL。似乎与我在 API 部分中使用的主机相同。要求你看我的新问题是不是太过分了? ***.com/questions/62837140/…

以上是关于Dockerize adonis.js + mysql的主要内容,如果未能解决你的问题,请参考以下文章

Adonis JS v5 关系缺少模型属性

使用 ORM 在 adonis JS 中选择特定列

如何将大文件加载到分块的 Adonis JS 中?

Vue.js + REST api 中的身份验证流程

Dockerize 框架测试“执行失败”

Dockerize Spring Boot mongo