'How to deal with vue ERR_NAME_NOT_RESOLVED? [duplicate]
I use docker-compose to create a web service like this. When I enter "frontend" container and curl http://backend:5000, it will return 200. But when I open the web http://localhost/login, I always get this error message at login page.
POST http://backend:5000/login net::ERR_NAME_NOT_RESOLVED
How should I fix this error?
Here is my environment and code.
docker ps
IMAGE COMMAND PORTS NAMES
backend "uvicorn app.main:ap…" 0.0.0.0:5000->5000/tcp backend
frontend "docker-entrypoint.s…" 0.0.0.0:80->8080/tcp frontend
postgres "docker-entrypoint.s…" 5432/tcp postgres
docker-comepose.yml
version: '2'
services:
frontend:
container_name: frontend
build: "frontend/."
ports:
- "80:8080"
backend:
container_name: backend
build: "backend/."
ports:
- "5000:5000"
db:
container_name: postgres
image: postgres
restart: always
environment:
- POSTGRES_PASSWORD=******
Myconfig.js
export const Myconfig = {
// Server configuration
backend_url:'http://backend:5000'
};
Login.vue
import axios from "axios";
import { Myconfig } from "./Myconfig";
import { mapMutations } from 'vuex';
export default {
data() {
var validatePass = (rule, value, callback) => {
if (value === "") {
callback(new Error("Please Enter your Password!"));
} else {
if (this.ruleForm.checkPass !== "") {
this.$refs.ruleForm.validateField("checkPass");
}
callback();
}
};
return {
ruleForm: {
account: "",
pass: "",
},
rules: {
pass: [{ validator: validatePass, trigger: "blur" }],
},
backend_url: Myconfig.backend_url,
};
},
package.json
{
"name": "PROJECT NAME",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"axios": "^0.24.0",
"core-js": "^3.6.5",
"element-ui": "^2.8.11",
"vue": "^2.6.11",
"vue-cookies": "^1.6.1",
"vue-router": "^3.5.3",
"vuex": "^3.1.2"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"vue-template-compiler": "^2.6.11"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}
Solution 1:[1]
as I have answered the similar question check answer on this post (even tho it was react based)
But core of the issue is:
Applications run in your browser, whereas if you deploy an application stack somewhere else, the REST of the services (APIs, DB and such) do not. So referencing your IP/DNS/localhost inside your application won't work, because there is nothing there. A container that contains a WEB application is there to only serve your browser (client) files and then the JS and the logic are executed inside your browser, not the container. I suspect this might be affecting your ability to connect to the backend. To solve this you have two options.
- Create an HTTP proxy as an additional service and your FE calls that proxy (set up a domain and routing), for instance, Nginx, Traefik, ... and that proxy then can reference your backend with the service name, since it does live in the same environment than API.
- Expose the HTTP port directly from the container and then your FE can call remoteServerIP:exposedPort and you will connect directly to the container's interface. (NOTE: I do not recommend this way for real use, only for testing direct connectivity without any proxy)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | matic1123 |
