首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dockerize adonis.js + mysql

Dockerize adonis.js + mysql
EN

Stack Overflow用户
提问于 2020-07-09 18:03:00
回答 1查看 1.8K关注 0票数 1

我正在尝试通过docker-compose来对接一个现有的adonis.js应用程序和MySQL。

这是我的Dockerfile

代码语言:javascript
复制
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文件

代码语言:javascript
复制
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容器显示应用程序正在运行,但我无法访问它,我总是得到:

代码语言:javascript
复制
This site can’t be reached
127.0.0.1 refused to connect.

代码语言:javascript
复制
This site can’t be reached
The connection was reset.

我尝试了不同的docker-compose设置和不同的dockerfile,几乎总是一切正常,但我就是无法访问服务器。我也尝试了不同的IP和端口,但仍然没有结果。

容器日志:

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-09 18:33:30

在这个设置中,有两件事突显出来。

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

代码语言:javascript
复制
info: serving app on http://127.0.0.1:80

这通常是一个配置问题的迹象,它将使进程无法访问。在Docker中,每个容器都有自己的localhost接口,因此“在127.0.0.1上侦听”的进程只能从容器私有的本地主机接口访问,而不能从其他容器或主机访问(无论您有什么ports:选项)。您通常需要将进程设置为“绑定”或“侦听”到特殊的0.0.0.0所有接口地址。

在Adonis中,它看起来像this is controlled by the $HOST environment variable;Adonis模板set this to 127.0.0.1。Adonis 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服务块替换为:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62812394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档