Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Listen to changes and reload container on code change - docker-compose

I am using docker-compose in visual studio 2019 with docker for windows running linux containers. I want to enable hot reload for the angular client app.

I modified the npm command running the app to include poll like:

"docker-start": "ng serve --host 0.0.0.0 --port 4200 --proxy-config proxy-conf.json --poll 1"

and added a volume into docker-compose like so:

volumes:
  - ./ClientApp:/app/

also additionally exposing the webpack port

ports:
  - 4200:4200
  - 49153:49153

docker-compose file is at the root of the repo and the angular app is in the /ClientApp folder. This makes the application throw cannot GET\ every time I navigate to localhost:4200. If I comment out the volume mapping, the application starts working but the reload does not. I would like it to listen to changes in the code and update the container as needed every time I change any frontend code.

Entire dockerfile:

FROM node:9.6.1

RUN mkdir -p /app
WORKDIR /app
EXPOSE 4200
EXPOSE 49153

ENV PATH /app/node_modules/.bin:$PATH

COPY . /app

RUN npm install --silent
RUN npm rebuild node-sass

CMD ["npm", "run", "docker-start"]
like image 438
qubits Avatar asked Apr 21 '19 16:04

qubits


People also ask

Does Docker compose detect changes?

Docker Compose: docker-compose does not detect changes in dockerfile. When specifying a dockerfile in the docker-compose file, TeamCity does not detect this dockerfile has changed so it will still use the old image which causes builds to fail.

How do I refresh Docker compose up?

Usage: compose-update [OPTIONS] [UPDATE_DIRS]... Update docker-compose images automatically. Takes one or more directorys as input and searches for a compose file in one of the following forms: "compose. yaml", "compose.

Does Docker compose restart containers?

Like the restart Docker command, Docker Compose includes the restart property to restart containers automatically.


2 Answers

Use nodemon to automatically restart the node server when code is changed . Before that install nodemon in your docker image and make sure it is present.

Refer this URL to install nodemon :https://www.npmjs.com/package/nodemon

then change your CMD in Dockerfile

CMD ["nodemon", "--exec", "npm", "run", "docker-start"]

This is reload your nodejs application whenever codes are changed

like image 130
Prem Avatar answered Oct 07 '22 16:10

Prem


You might be facing several issues here, since Docker and Windows don't get along all to well unfortunately.

The cannot GET\ error is defenitely weird and should not occur. First you might want to verify that your volume was mounted correctly and all data are there after running the container.

If the working directory inside your container is empty (which might be the case) you could try to check your docker settings, whether the required drives are shared correctly.

If they are and you still cannot see any data you might want to reset your credentials. This requires you to provide your windows password to docker.

Docker Settings

The bad News

The bad news is, that apparently the inotify event (which is used to detect changes on mounted volumes) does not work with Docker on Windows yet, according to the Docker Docs. You might want to follow their recommendations on how to get around that issue.

The good News

Luckily, there are many projects which attempt to solve your problem, such as Go-Touch. I haven't verified that myself, but I hope you will benefit from them.

like image 22
nullchimp Avatar answered Oct 07 '22 16:10

nullchimp