Docker container doesn't reload Angular app

后端 未结 5 650
忘掉有多难
忘掉有多难 2020-12-01 18:32

I have some issue with ng serve in my docker container running by docker-compose.

Dockerfile

FROM node:7.1

RUN mkdir -p /u         


        
相关标签:
5条回答
  • 2020-12-01 18:48

    A solution can be the chokidar wrapper, which is a dependency of the angular package. I dont know, if that was the status in 2017. You don't need to expose any extra ports. Just use an environment variable in your docker-compose.

    Basic configuration:

    Dockerfile

    CMD ng serve --host 0.0.0.0
    

    docker-compose.yml

    environment:
      - CHOKIDAR_USEPOLLING=true
    

    This should hot-reloading your browser. Tested on Chrome and Angular 8

    Package for further investigation: https://github.com/paulmillr/chokidar

    0 讨论(0)
  • 2020-12-01 18:49

    Webpack uses a port to do live reload of the application. That port is 49153 by default.

    You have to expose and bind that port in the container to the host port and that should solve your problem.

    So, add this to your Dockerfile.

    FROM node:7.1
    
    RUN mkdir -p /usr/src/app
    WORKDIR /usr/src/app
    COPY package.json /usr/src/app
    RUN npm install
    RUN npm install -g angular-cli
    COPY . /usr/src/app
    
    EXPOSE 4200 49153
    
    CMD [ "npm", "start" ]'
    

    And this to your docker-compose.yml.

    web:
        build: .
        ports:
            - '8089:4200'
            - '49153:49153'
        volumes:
            - .:/usr/src/app/
        environment:
            - NODE_ENV=dev
        command: bash -c "npm start"
    
    0 讨论(0)
  • 2020-12-01 18:58

    Another solution without polling.

    Background:

    I work on large Angular and React projects, the polling even every 10 seconds (--poll 10000) produce a lot of network traffic (in task manager you can check performance of docker nat interface). And in turn it produces high CPU load.

    Solution:

    If you use phpStorm/other Intellij produce or VS code you can add File watchers. I wrote the following script that helps me with this:

    #!/bin/bash
    
    image="${*:1:1}"
    file="${*:2}"
    machine=$(docker ps --filter ancestor="$image" --format "{{.ID}}")
    
    if [ -n "$machine" ]
      then
        docker exec "$machine" touch "$file"
    fi
    

    After that I added following File Watcher (notice that the Trigger is switched off on external events):

    Notes: It is important that your docker exec has no parameter -it as tty or interactive parameters requires to use winpty (located where git bash is installed). Also this solution is not Angular specific it is more docker specific, works the same for any webpack-dev-server app.

    Also, phpStorm periodically shows File Cache Conflict dialog about file difference. To disable this prompt one can switched off file sync. https://stackoverflow.com/a/6628645

    0 讨论(0)
  • 2020-12-01 18:59

    I found solution for both problems:

    1. inotify -> just edit package.json in "scripts" section this line: "start": "ng serve --host 0.0.0.0 --poll", required only for Windows host,

    2. hot reload -> add expose 49153 in Dockerfile and ports - '49153:49153' in docker-compose.yml like @kstromeiraos mentioned.

    0 讨论(0)
  • 2020-12-01 19:01

    My solution using node:slim.

    No need for copying data into containers. Just use volumes.

    Dockerfile:

    NOTE: --poll 1

    FROM node:slim
    
    RUN npm install @angular/cli@latest -g
    
    RUN mkdir -p /home/boilerplate
    
    WORKDIR /home/boilerplate
    
    EXPOSE 4200
    
    CMD ng serve --port 4200 --host 0.0.0.0 --poll 1

    Compose:

      project:
        image: project
        build:
          context: .
          dockerfile: projectdir/Dockerfile
        volumes:
        - ./projectdir:/home/boilerplate
        ports:
        - 4200:4200
    
    0 讨论(0)
提交回复
热议问题