问题描述
我做了一个docker-compose时得到以下错误。 该应用程序正在运行但无法发出任何api post / get请求。 快速服务器使用端口5000。
3000:] [同时从本地主机试图代理请求/ API /用户/用户发生HPM]错误 (ECONNREFUSED)( )
尽管设置了react代理,但错误仍然存??在。
setupProxy.js
const proxy = require('http-proxy-middleware');
module.exports = function(app) {
// app.use(proxy('/auth/github', { target: 'http://localhost:3000/' }))
app.use(proxy('/api/users/auth/github', { target: 'http://localhost:5000/' }))
app.use(proxy('/api/users/', { target: 'http://localhost:5000/' }))
app.use(proxy('/api/posts/', { target: 'http://localhost:5000/' }))
}
Dockerfile
FROM node:8.10.0-alpine
EXPOSE 3000
COPY . /home/app
WORKDIR /home/app
RUN npm install
CMD ["npm", "start"]
泊坞窗,compose.yml
# docker-compose.yml
version: "3"
services:
app:
build: .
depends_on:
- postgres
ports:
- "3000:3000"
- "9229:9229"
postgres:
image: postgres:9.6.8-alpine
expose:
- 5432
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: user
POSTGRES_DB: db
的package.json
{
"name": "sequelize-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"client": "cd ./client && npm start",
"server": "nodemon app.js --ignore client",
"build": "echo 'hello build'",
"start": "concurrently --kill-others \"npm run server\" \"npm run client\""
},
"author": "",
"license": "ISC",
"dependencies": {
"async": "^2.6.1",
"bcrypt": "^3.0.3",
"body-parser": "^1.18.3",
"concurrently": "^4.1.0",
"cookie-parser": "^1.4.3",
"cookie-session": "^2.0.0-beta.3",
"cors": "^2.8.5",
"crypto": "^1.0.1",
"dotenv": "^6.2.0",
"express": "^4.16.4",
"express-flash": "0.0.2",
"express-session": "^1.15.6",
"jsonwebtoken": "^8.4.0",
"morgan": "^1.9.1",
"nodemailer": "^5.1.1",
"nodemon": "^1.18.9",
"passport": "^0.4.0",
"passport-github": "^1.1.0",
"passport-github2": "^0.1.11",
"passport-jwt": "^4.0.0",
"passport-local": "^1.0.0",
"pg": "^7.8.0",
"pg-hstore": "^2.3.2",
"sequelize": "^4.42.0"
}
}
1楼
我认为您需要将localhost:5000更改为docker-compose.yml中的服务名称。 在这种情况下,您需要在compose文件中设置在localhost:5000上运行的任何服务器。 请记住,您的容器在Docker网络中运行,因此,它们无法访问主机上的本地主机。
在此示例中,您可以看到我需要将PMA_HOST环境变量设置为db服务而不是“普通主机”。 在数据库配置中,在我的源代码中,我还将主机设置为相同的数据库服务,一切正常。
版本:'3'
services:
app:
build: .
ports:
- 80:80
depends_on:
- db
db:
image: mariadb:10.0
volumes:
- db:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: 123
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- 8080:80
environment:
PMA_HOST: db
depends_on:
- db
volumes:
db:
这是必需的,因为每次运行新容器时,它都会在新的Docker网络中获得不同的IP。 在这种情况下,我们总是需要检查这个新IP并在我们的代码中设置它。 Docker通过让我们将新主机附加到一个简单且不可变的名称来解决这个问题,该名称在组成时就是服务的名称。
更新:network_mode方法
如果您已在本地主机上运行服务(例如:API服务器),并且您正在使用docker获取将与该API交互的新服务(例如:Web客户端UI),但由于某种原因,您可以'或者不想在docker-compose.yml文件上设置API,可以更改network_mode
和environment HOST
。
在这种方法中,您必须将容器上的端口映射到主机上未使用的端口 。
所以,假设您有一个在localhost:80
上运行的API,并且您在端口3000上的docker上运行节点服务器。如果您没有在localhost:3000
运行任何内容,则可以执行以下操作:
spa:
user: ${COMPOSE_UID}:${COMPOSE_GID}
image: node:10-slim
working_dir: /home/node/app
environment:
- HOST=0.0.0.0
ports:
- 3000:3000
volumes:
- ./:/home/node/app
command: bash -c 'yarn install && yarn run dev'
network_mode: "host"
2楼
我改变了一些事情。
Dockerfile
FROM node:8.10.0-alpine
EXPOSE 80:8080
COPY . /home/app
WORKDIR /home/app
RUN npm install
CMD ["npm", "start"]
泊坞窗,compose.yml
version: "3"
services:
app:
build: .
depends_on:
- postgres
ports:
- "8080:8080"
environment:
- PORT=8080
- NODE_ENV=dev
- ENV_NAME=local
postgres:
image: postgres:9.6.8-alpine
expose:
- 5432
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: user
POSTGRES_DB: db
setupProxy.js
const proxy = require('http-proxy-middleware');
module.exports = function(app) {
app.use(proxy('/auth/github', { target: 'http://127.0.0.1:8080/' }))
app.use(proxy('/api/users/auth/github', { target: 'http://127.0.0.1:8080/' }))
app.use(proxy('/api/users/', { target: 'http://127.0.0.1:8080/', "secure": false }))
app.use(proxy('/api/posts/', { target: 'http://127.0.0.1:8080/' }))
}