express js middleware not getting connected using docker-compose - docker

I am relatively new to nextjs and react space of development, trying my hand over this, please pardon if anything straight forward and i am not seeing it.
So i am trying to call some API which gives some data which i want to render on UI. So far on local it was giving corrs issue so i have added express js middleware to bypass this issue.
Now i want to deploy this app on docker using Dockerfile. So i have got things right and UI compiles successfully but middleware API calls are failing. Below is the Dockerfile, docker-compose file i am using to start the app.
client Dockerfile:
FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
EXPOSE 3000
CMD [ "npm" , "run", "dev" ]
server Dockerfile
FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
EXPOSE 5000
CMD [ "npm", "run" , "start" ]
docker-compose file
version: "3"
services:
frontend:
container_name: awesome_web
build:
context: ./
dockerfile: Dockerfile
image: apaliwal/awesome_web
ports:
- "3000:3000"
volumes:
- ./:/usr/src/app
backend:
container_name: awesome_server
build:
context: ./server
dockerfile: Dockerfile
image: apaliwal/awesome_server
ports:
- "8080:8080"
volumes:
- ./server:/usr/src/app
client package.json
{
"name": "server",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "NODE_TLS_REJECT_UNAUTHORIZED='0' node server.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.1",
"node-fetch": "^2.6.0"
}
}
client package.json
{
"name": "project_name",
"version": "1.0.0",
"main": "pages/index.js",
"private": true,
"scripts": {
"dev": "next",
"build": "next build",
"start": "next start"
},
[dependecies]
...
...
...
server.js
const express = require('express');
const http = require('http');
const fetch = require('node-fetch');
const app = express();
const server = http.createServer(app);
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
next();
});
app.get('/issues/:projectID', (req, res) => {
fetch(`[url]`, {
headers: [auth],
compress: false
})
.then(async (response) => {
console.log(response.status);
if(response.status >= 200 && response.status < 400) {
const jsonResponse = await response.text();
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(jsonResponse);
}
})
.catch((err) => {
console.error(err);
res.writeHead(500, {'Content-Type': 'text/plain'});
res.end("Error occurred! Data not found/internal server error");
});
})
server.listen(8080, '127.0.0.1' , err => console.log( err || "Your server is listening on "+'127.0.0.1'+" port "+'8080'));
Please help with this, tried many things exposing port to 8080.
docker-compose up --build does work below are the console logs for it as well, it just in network logs the getting:
(failed)net::ERR_SOCKET_NOT_CONNECTED

Related

Dockerized Vue app - hot reload does not work

Dockerized Vue app loads normally to the browser, when applying changes to the code are not reflected without refresh.
Dockerfile
FROM node:14-alpine
# make the 'app' folder the current working directory
WORKDIR /app
# copy 'package.json'
COPY package.json .
# install project dependencies
RUN npm install
# copy project files and folders to the current working directory (i.e. 'app' folder)
#COPY . .
EXPOSE 8080
CMD ["npm", "run", "serve"]
docker-compose.yml
version: '3.9'
services:
frontend:
container_name: 'frontend'
build: ./
stdin_open: true
tty: true
ports:
- '8080:8080'
volumes:
- ./:/app
- /app/node_modules
environment:
- HOST=0.0.0.0
- CHOKIDAR_USEPOLLING=true
package.json
{
"name": "project",
"version": "1.6.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
},
"dependencies": {
"vue": "^2.6.12",
"vue-axios": "^3.2.2",
"vuetify": "2.3.18",
"vuex": "^3.6.0",
},
"devDependencies": {
"#vue/cli-plugin-babel": "^4.5.10",
"#vue/cli-plugin-eslint": "^4.5.11",
"#vue/cli-plugin-router": "^4.5.10",
"#vue/cli-plugin-unit-jest": "^4.5.10",
"#vue/cli-plugin-vuex": "^4.5.10",
"#vue/cli-service": "^4.5.10",
"#vue/eslint-config-prettier": "^6.0.0",
"#vue/test-utils": "1.1.2",
"babel-eslint": "^10.1.0",
"node-sass": "^5.0.0",
"sass": "^1.32.4",
"sass-loader": "^10.1.1",
"vuetify-loader": "^1.6.0",
"webpack": "^4.46.0"
}
}
When I'm running the project locally, the hot reload works great!
Any idea what might be the issue on the docker?
EDIT Since this is a docker for development purposes, I have tried as well to remove the COPY . . without result.
After many days I managed to add hot reload by adding in the webpack configuration file this config:
devServer: {
public: '0.0.0.0:8080'
}
After digging to the official vue js repo, specifically to serve.js file found the public option which:
specify the public network URL for the HMR client
If you do not want to edit your webpack config, you can do this directly from docker-compose file in the command:
command: npm run serve -- --public 0.0.0.0:8080
The issue can be also in your vue.config.js file.
module.exports = defineConfig({
configureWebpack: {
entry: "./src/main.js",
devServer: {
hot: true,
},
watch: true,
watchOptions: {
ignored: /node_modules/,
poll: 1000,
},
},
transpileDependencies: true,
});
Your template looks very close to this Docker Vue Hot-Reload template that works fine.
The only difference is the HOST=0.0.0.0 is set inside Dockerfile in the mentioned template. Maybe doing a fresh build would work.
PS: I created this template.

Dockerize Vue.js: hot-reload is not working for vue/cli#4.5 or later versions

I greatly appreciate your effort and the time to solve unresponsive hot-reload function when trying to run Vue.js app on Docker container using Docker engine on Windows 10 while WSL2 active, please take a look at below configurations:
Vue.Setup.Dockerfile
FROM node:17-alpine
EXPOSE 8080
WORKDIR /app/frontend
RUN npm --force install -g #vue/cli#4.5.15
COPY /frontend /app/frontend
ENV PATH /app/frontend/node_modules/.bin:$PATH
CMD [ "npm", "run", "serve" ]
docker-compose.yml
version: "3.8"
services:
vue:
build:
context: .
dockerfile: dockerfiles/Vue.Setup.Dockerfile
restart: always
ports:
- "127.0.0.1:8080:8080"
container_name: vue_ui
volumes:
- ./frontend/:/app/frontend/
- /app/frontend/node_modules
environment:
- CHOKIDAR_USEPOLLING=true
vue.config.js
module.exports = {
publicPath:
process.env.NODE_ENV === "production"
? "/static/dist/"
: "http://127.0.0.1:8080",
pages: {
index: {
entry: 'src/main.js',
template: 'public/index.html',
filename: 'index.html',
title: 'QuestionTime',
chunks: ['chunk-vendors', 'chunk-common', 'index']
},
},
// Webpack configuration
devServer: {
host: "0.0.0.0",
port: "8080",
hot: true,
headers: {"Access-Control-Allow-Origin": "*"},
devMiddleware: {
publicPath: "http://127.0.0.1:8080",
writeToDisk: (filePath) => filePath.endsWith("index.html"),
},
static: {
watch: {
ignored: "/node_modules/",
usePolling: true,
},
},
client: {
webSocketURL: {
/* You need to config this option, otherwise the below error will occur
in your browser console when trying to connect to development server
from another Docker container:
WebSocket connection to 'ws://127.0.0.1:<port-number>/ws' failed
*/
hostname: "0.0.0.0",
pathname: "/ws",
port: 8080,
},
},
},
};
Note: When run the command:
docker-compose up
The below message will show:
It seems you are running Vue CLI inside a container.
Since you are using a non-root publicPath, the hot-reload socket
will not be able to infer the correct URL to connect. You should
explicitly specify the URL via devServer.public.
Access the dev server via http://localhost:<your container's
external mapped port>
FYI: the option:
devServer.public
is no longer available in Vue/cli#4 or later versions.
WORKAROUND
solution
Thanks,

Nextjs: The page does not render when the URL is entered directly from the browser, 404 error

My problem is as follows.
I made a project with Next.js. My project works fine on Local, Local Docker, Heroku and Vercel. However, I have a problem when I go to production environment and publish Docker under the domain. When the address is entered from the browser, the page corresponding to the Router gives 404. But when I navigate through the menu, I don't have a problem. In other words, when the URL is entered directly, it does not render. How can i solve this problem. Domain for those who want to review. Original URL: https://beta.ardictech.com/ and this is Vercel URL: https://ardic-web.vercel.app/
For example, it gives 404 when directly entered with the URL, but when you click on the logo in the upper left and go to the "/" address, the page can be rendered. Or, the pages are rendered while navigating the menu, but if you enter the same address directly or press F5, it does not render.
next.config.js
module.exports = {
webpackDevMiddleware: (config) => {
config.watchOptions = {
polls: 1000,
aggregateTimeout: 300,
};
return config;
},
async headers() {
return [
{
// matching all API routes
source: "/api/:path*",
headers: [
{ key: "Access-Control-Allow-Credentials", value: "true" },
{ key: "Access-Control-Allow-Origin", value: "*" },
{
key: "Access-Control-Allow-Methods",
value: "GET,OPTIONS,PATCH,DELETE,POST,PUT",
},
{
key: "Access-Control-Allow-Headers",
value:
"X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version",
},
],
},
];
},
trailingSlash: true,
reactStrictMode: true,
generateEtags: false,
i18n: {
locales: ["en", "tr"],
defaultLocale: "en",
localeDetection: false,
},
env: {
VERSION: process.env.VERSION,
MODE: process.env.MODE,
APP_NAME: process.env.APP_NAME,
HOST: process.env.HOST,
BASE_URL: process.env.BASE_URL,
HOSTNAME: process.env.HOSTNAME,
PORT: process.env.PORT,
GA_TRACKING_ID: process.env.GA_TRACKING_ID,
},
generateBuildId: async() => {
return new Date().toDateString();
},
eslint: {
ignoreDuringBuilds: false,
},
};
docker-compose.yml
version: "2"
services:
ui:
container_name: beta.ardictech.com
hostname: beta.ardictech.com
restart: always
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
volumes:
- ./:/app
- /app/node_modules
- /app/.next
env_file:
- .env
Dockerfile
FROM node:current-alpine as base
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
FROM base AS build
ENV NODE_ENV=production
WORKDIR /build
COPY --from=base /app ./
RUN npm run build
FROM node:current-alpine AS production
ENV NODE_ENV=production
WORKDIR /app
COPY --from=build /build/package*.json ./
COPY --from=build /build/.next ./.next
COPY --from=build /build/public ./public
RUN npm install
EXPOSE 3000
CMD npm run start

In VSCode, 'Python: Remote Attach' fails to connect to a running Docker Container

Good evening,
I have a container which is running and ready to connect. In VSCode I've tried to 'Attach Visual Studio Code' to open a new Dev Container, select the sources, hoping I can debug.
I'm unable to select breakpoints and the code isn't running.
Nothing happens.
I've also tried 'Python: Attach Remote'.
Nothing happens and there's no errors.
Launch.json:
{
"name": "Python: Remote Attach",
"type": "python",
"request": "attach",
"connect": {
"host": "0.0.0.0",
"port": 3000
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "."
},
]
}
Docker Compose.yml
services:
sfunc:
image: sfunc
build:
context: .
dockerfile: ./Dockerfile
command: ["sh", "-c", "pip install debugpy -t /tmp && python /tmp/debugpy --log-to-stderr --wait-for-client --listen 127.0.0.1:3000 home/site/wwwroot/TimerTrigger/__init__.py "]
ports:
- 3000:3000
How could I troubleshoot this ?
Thank you
Those hostnames didn't work for me. Using localhost in the launch.json and 0.0.0.0 as the host in the --listen option worked.

Why can't I remote debug with Docker/VScode?

I'm trying to remotely debug a Go app using Docker/VScode. My files look like:
main.go
package main
import (
"log"
"net"
"net/http"
"strings"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
message := r.URL.Path
message = strings.TrimPrefix(message, "/")
message = "Hello, " + message + "!"
w.Write([]byte(message))
})
log.Print("starting web server")
listener, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatal(err)
}
log.Printf("Start listening: %v", listener.Addr().String())
if err := http.Serve(listener, nil); err != nil {
log.Fatal(err)
}
}
Dockerfile
FROM golang:1.12
ENV GOPATH /go
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
RUN go get github.com/go-delve/delve/cmd/dlv
# set the working directory to /go/src
WORKDIR $GOPATH/src
# Copy everything from the current directory to the working directory inside the container
# (as set by WORKDIR)
COPY . .
# 8080 is for the web application
EXPOSE 8080 2345
docker-compose.yml
version: "3.0"
services:
web:
container_name: go-delve-docker-vscode-example
build: "./"
ports:
- "8080:8080"
- "2345:2345"
security_opt:
- "seccomp:unconfined"
tty: true
stdin_open: true
# command: go run main.go
command: dlv debug --headless --listen=:2345 --api-version=2 --log main.go
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Delve into Docker",
"type": "go",
"request": "launch",
"mode": "remote",
"remotePath": "/go/src/",
"port": 2345,
"host": "127.0.0.1",
"program": "${workspaceRoot}",
"showLog": true
}
]
}
I can see docker logs for my app, I know it's listening on 2345. But for whatever reason, I can't seem to debug the app. The other issue I'm seeing is, I can't see any logs for trying to run the launch.json.
Edit: I'm running this on Mac OSX, using Docker Desktop.
Docker desktop for Mac runs docker inside a Virtual Machine.
Instead of trying to reach 127.0.0.1:2345, you should use your Virtual machine IP.

Resources