我是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"]
现在问题就在于:每当我在角度代码中改变时,带有角度的泊坞窗图像都不会重新加载更改。我不知道我做错了什么。
答案 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)
确保端口500
在49153
中暴露(使用正确的节点版本)
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"
将生成一个映像并启动一个新容器,该容器将自动重新加载新更改。