Home > Software design >  Is this dockerfile set correctly to serve a React.js build on port 5000?
Is this dockerfile set correctly to serve a React.js build on port 5000?

Time:11-07

I have a React.js app which I have dockerized and it was working fine until yesterday when there was some kind of an error which I found out is due to node version 17 so I decided to get the docker image's node version back to 16. All good, but since I did this, I cannot get the docker image to run on the specified port.

Here is my dockerfile:

ROM node:16.10-alpine as build

RUN mkdir /app

WORKDIR /app

COPY /front-end/dashboard/package.json /app

RUN npm install

COPY ./front-end/dashboard /app

RUN npm run build

# Install `serve` to run the application.
RUN npm install -g serve

# Set the command to start the node server.
CMD serve -s -n build

# Tell Docker about the port we'll run on.
EXPOSE 5000

As you can see, I am making a build which I then serve on port 5000 but for some reason that does not work anymore and it used to work fine.

All I can see as an output in docker is:

Serving! │

│ │

│ - Local: http://localhost:3000 │

│ - On Your Network: http://172.17.0.2:3000

When I go to localhost:3000 nothing happens which is fine but it should be working on port 5000 and it does not run there. Any idea why I cannot run the docker image's build on port 5000 as I used to do before?

I use docker run -p 5000:5000 to run it on port 5000 but this does not solve the problem.

CodePudding user response:

From the logs you can see that your application might be listening for traffic on localhost:3000. Your EXPOSE 5000 line does not change that behaviour but makes Docker (and other users) think port 5000 is important. Since nothing is listening on port 3000 obviously you should get a 'connection refused'. You may want to lookup https://docs.docker.com/engine/reference/builder/#expose

To get out of that situation:

  • ensure your dockerized process is listening to 0.0.0.0:5000. You will have to add -l tcp://0.0.0.0:5000to your CMD line (see https://github.com/vercel/serve/blob/main/bin/serve.js#L117)

  • When running the container, ensure you expose the port by using docker run -p 5000:5000 ...

  • If need be tell your docker host's firewall to allow traffic to <ip>:5000

Now if you connect to http://<ip>:5000 you should see the application's response.

CodePudding user response:

Your app is listening on port 3000. So you need to map whatever port you want to use on the host to port 3000. If you want to use port 5000, you should use -p 5000:3000. Then you should be able to access it using localhost:5000 on the host machine.

You should think of containers as separate machines from the host. So when the container says that it's listening on localhost:3000, that means localhost in the context of the container. Not the host.

  • Related