docker compose中的Angular不会重新加载更改

时间:2017-10-31 10:30:47

标签: angularjs docker docker-compose dockerfile

我是docker的新手,我正在尝试使用django-rest和angular来做一个应用程序。我当前的docker-compose文件如下所示:

version: '3'

services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=pirate
      - POSTGRES_USER=django
      - POSTGRES_PASSWORD=secreat
    volumes:
      - db-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
  backend:
    entrypoint: /entrypoint.sh
    build: ./backend
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
    healthcheck:
        test: [“CMD”, “curl”, “--fail”, 'http://localhost:8000']
        interval: 10s
        timeout: 5s
        retries: 3
  frontend:
    build: ./frontend
    volumes:
      - .:/app
    healthcheck:
        test: [“CMD”, “curl”, “--fail”, 'http://localhost:4200']
        interval: 10s
        timeout: 5s
        retries: 3
    ports:
      - "4200:4200"
  nginx:
    build: ./nginx
    healthcheck:
        test: [“CMD”, “curl”, “--fail”, 'http://localhost']
        interval: 10s
        timeout: 5s
        retries: 3
    ports:
      - "80:80"
    links:
      - frontend
volumes:
  db-data:

这是我的角度Dockerfile:

FROM node:8.6
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app
RUN npm install

# Here starts angular cli workaround
USER node
RUN mkdir /home/node/.npm-global
ENV PATH=/home/node/.npm-global/bin:$PATH
ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
RUN npm install -g @angular/cli
# Here ends 

COPY . /usr/src/app
CMD ["npm", "start"]

现在问题就在于:每当我在角度代码中改变时,带有角度的泊坞窗图像都不会重新加载更改。我不知道我做错了什么。

2 个答案:

答案 0 :(得分:2)

问题与文件系统在Docker中的工作方式有关。为了解决这个问题,我建议您执行热重新加载(在Dockerfile中添加EXPOSE 49153,在docker-compose.yml中添加端口- '49153:49153'

还有其他解决方案,如inotify或nodemon,但它们要求您在启动应用程序时使用--poll选项。问题是他们继续轮询fs进行更改,如果应用程序很大,你的机器将比你想要的慢得多。

我想我发现了这个问题。您复制了./app中的/usr/src/app,但您将.:/app设置为卷。因此,这意味着如果您进入泊坞窗实例,则会在两个位置找到您的应用:/app/usr/src/app

要解决此问题,您应该使用此映射:.:/usr/src/app

顺便说一句,您将使用主机中的node_modules,这可能会产生一些问题。为避免这种情况,您可以添加空卷映射:/usr/src/app/node_modules

如果你进入正在运行的容器,你会发现文件夹app存在两次。您可以通过执行以下命令来尝试:

docker exec -it $instanceName /bin/sh
ls /app
ls /usr/src/app

问题是,只有/app的内容在您的编码过程中发生了变化,而您的应用程序当前正在执行的/usr/src/app内容始终保持不变。

docker-compose中的frontend应如下所示:

frontend:
    build: ./frontend
    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules

答案 1 :(得分:0)

我在Windows的Docker桌面上遇到了同样的问题。我知道已经有一段时间了,但是任何人都来这里寻找像我这样的答案,您应该执行以下步骤。

start的{​​{1}}部分将"start": "ng serve --host 0.0.0.0 --poll 500"修改为scripts。 (这里的数字package.json表示客户端将每500毫秒检查一次是否已进行更改,您可以减少此数字。请参考this

确保端口50049153中暴露(使用正确的节点版本)

Dockerfile

映射FROM node:10.16.3-alpine WORKDIR /app COPY package.json . RUN npm install COPY . . EXPOSE 4200 49153 CMD npm run start 中的端口和卷

docker-compose.yml

此后,运行version: "3.7" services: webapp: build: . ports: - "4200:4200" - "49153:49153" volumes: - "/app/node_modules" - ".:/app" 将生成一个映像并启动一个新容器,该容器将自动重新加载新更改。