Docker重建镜像后代码修改未生效问题求助
代码修改后Docker容器未更新的排查与解决
问题场景
我在项目开发阶段使用Docker进行运行验证,近期修改代码后执行Docker镜像重建与容器启动操作,发现代码变更未被应用,容器运行结果与修改前完全一致。
我的Dockerfile内容
### STAGE 1: Build ### FROM node as build WORKDIR /usr/src/app COPY package.json package-lock.json ./ COPY . . RUN npm install -g @angular/cli RUN npm install RUN ng build --prod ### STAGE 2: Run ### FROM nginx:1.17.1-alpine COPY nginx.conf /etc/nginx/nginx.conf COPY --from=build /usr/src/app/dist/* /usr/share/nginx/html
构建与运行命令
docker build -t edtmaker . docker run --name edtmaker -d -p 8888:80 edtmaker
常见原因及解决方法
1. Docker构建缓存复用
Docker会对构建步骤进行缓存,如果代码文件的修改未触发缓存失效,会直接复用之前的构建结果,导致新代码没被打包。
解决:
构建时强制禁用缓存,确保所有步骤重新执行:
docker build --no-cache -t edtmaker .
2. 旧容器未清理,启动了旧实例
如果之前的容器未删除,重复执行docker run可能因容器名称冲突报错,或误启动遗留的旧容器实例。
解决:
先停止并删除旧容器,再启动新容器:
docker stop edtmaker docker rm edtmaker docker run --name edtmaker -d -p 8888:80 edtmaker
或者启动时使用--rm参数,容器停止后自动删除,避免遗留旧容器:
docker run --rm --name edtmaker -d -p 8888:80 edtmaker
3. Angular构建产物路径错误
Angular执行ng build --prod后,产物默认放在dist/[项目名称]子目录下,而非dist根目录。原Dockerfile中的COPY命令可能只复制了空目录或错误内容。
解决:
- 本地执行
ng build --prod,查看dist目录下的具体子目录名称(例如edtmaker)。 - 修改Dockerfile中的COPY命令:
COPY --from=build /usr/src/app/dist/edtmaker /usr/share/nginx/html
将edtmaker替换为你的实际项目名称。
4. 验证镜像内容
构建完成后,进入镜像内部确认是否包含最新的构建产物:
docker run --rm -it edtmaker sh # 在容器内查看html目录的文件内容 ls -l /usr/share/nginx/html
检查文件的修改时间是否为最新,或查看具体文件内容是否符合代码修改后的结果。
内容的提问来源于stack exchange,提问作者pleijan
相关产品推荐
相关产品推荐

