Docker Compose 前后端部署踩坑实录:3 个坑让我的容器反复 Exit(1)
技术栈Vue 3 Python/Gunicorn MySQL Nginx Docker Compose部署环境阿里云 Ubuntu阅读时长约 8 分钟前言最近在阿里云上用 Docker Compose 部署一个前后端分离项目前端 Vue 打包后丢给 Nginx后端是 Python Gunicorn数据库 MySQL。本以为是个常规操作结果连踩三个坑容器反复Exited (1)排查了大半天。复盘下来发现这几个问题其实都很典型——尤其是第二个和第三个属于对 Docker 运行机制理解不到位导致的架构性错误。记录下来希望能帮到同样在摸索容器化部署的同学。坑一构建产物「人间蒸发」报错信息cp: cant stat /app/dist/*: No such file or directory现象执行docker compose up -d前端镜像构建阶段直接报错Nginx 启动失败。根因Vue 项目在容器内执行npm run build时静默失败了。可能的原因包括网络超时导致依赖没装全Node 版本和项目不兼容代码本身有构建错误TypeScript 类型报错、ESLint 严格模式拦截等构建没成功/app/dist目录压根没生成。到了 Dockerfile 的下一个阶段COPY或cp找不到源文件直接炸了。坑在哪Docker 默认会用缓存如果之前有一次成功构建的缓存层后续修改了代码但没清缓存npm install那一步可能直接跳过导致新代码跑在旧依赖上报错信息还特别迷惑。解法# 强制重建不用缓存完整输出日志dockercompose build --no-cache frontend# 盯住输出里的这些关键词# ERROR、npm ERR!、Failed to compile看到完整的构建日志后问题通常一目了然。修完代码再重新构建即可。坑二把「构建任务」当成了「服务」报错信息Container yunji-frontend-builder Exited (1) service frontend didnt complete successfully: exit 1现象docker compose build显示✔ Image Built看起来镜像构建成功了。但docker compose up之后容器状态却是Exited (1)。更诡异的是容器名字叫yunji-frontend-builder——一个前端服务为什么叫 builder根因这是一个对 Docker Compose 运行机制的根本性误解。当时的docker-compose.yml大概长这样简化版services:frontend:build:./frontendcontainer_name:yunji-frontend-buildercommand:cp-r /app/dist/* /shared/html/volumes:-shared-html:/shared/htmlnginx:image:nginx:alpinevolumes:-shared-html:/usr/share/nginx/htmlports:-80:80volumes:shared-html:思路是frontend 容器负责构建并把产物复制到共享卷nginx 容器从共享卷读取文件。问题在于Docker Compose 里的每个 service 都是一个长期运行的守护进程。cp命令执行完就退出了进程结束Docker 检测到主进程退出判定服务失败返回exit 1。这就好比你雇了个人来当前台结果他把文件放桌上就走了——老板Docker觉得他旷工了。解法不要在docker-compose.yml里用command跑一次性任务。前端服务应该直接运行 Nginx 守护进程。坑三架构冗余——一个前端拆成俩容器现象docker compose ps -a一看出现了两个跟前端相关的容器yunji-frontend-builderyunji-nginx它们通过volumes交互builder 把文件写进共享卷nginx 从共享卷读。根因没用上 Docker 最核心的特性之一——多阶段构建Multi-stage Build。多阶段构建的思路是在一个 Dockerfile 里定义多个阶段前面的阶段负责编译/构建后面的阶段只复制产物最终镜像里不包含构建工具链既干净又小。如果不用多阶段构建硬要把构建和运行拆成两个容器就得靠共享卷来传递文件。这不仅增加了复杂度还引入了时序依赖builder 还没跑完nginx 就启动了怎么办、命名混乱、调试困难等一系列问题。解法用标准的多阶段构建 Dockerfile一个服务搞定frontend/Dockerfile修正后# ---- 阶段 1构建 ---- FROM node:18-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # ---- 阶段 2运行 ---- FROM nginx:alpine # 直接从上一阶段复制产物不需要共享卷 COPY --frombuild /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD [nginx, -g, daemon off;]docker-compose.yml修正后services:frontend:build:./frontendimage:jizhang-frontend:latest# 明确指定镜像名container_name:yunji-frontend# 规范命名不要叫 builderports:-80:80depends_on:-backend# 不写 command让 Dockerfile 的 CMD 生效# 不挂载 volumes 覆盖 /usr/share/nginx/htmlbackend:build:./backendimage:jizhang-backend:latestcontainer_name:yunji-backendports:-8000:8000depends_on:-dbdb:image:mysql:8.0container_name:yunji-dbenvironment:MYSQL_ROOT_PASSWORD:${DB_PASSWORD}MYSQL_DATABASE:jizhangvolumes:-db-data:/var/lib/mysqlvolumes:db-data:对比修正前后改动的核心就三点删掉独立的 nginx 服务——前端自己就是 Nginx删掉command: cp ...——构建产物在 Dockerfile 里就打包好了删掉共享卷——不需要容器间传文件了排查命令速查表遇到类似问题时按这个顺序排查构建失败dist 目录缺失# 强制重建完整日志dockercompose build --no-cache frontend# 关注 ERROR 和 npm ERR!容器启动后立即退出# 查看所有容器状态包括已停止的dockercomposeps-a# 查看容器日志dockercompose logs frontend# 进容器检查文件是否存在dockercompose run--rmfrontendls-la/usr/share/nginx/html架构/配置问题# 检查 compose 配置结构catdocker-compose.yml|grep-A10services:# 检查本地镜像列表dockerimages|grepjizhang踩坑总结坑表象本质构建产物缺失cp: cant stat /app/dist/*构建静默失败 缓存干扰容器秒退Exited (1)把一次性命令当守护进程架构冗余两个容器 共享卷没用多阶段构建回头看这三个问题其实都指向同一个认知盲区Docker 不只是把东西装进容器它有自己的一套关于进程生命周期和镜像分层的设计哲学。不理解这些就容易把传统的部署思维先编译、再拷贝、再启动原封不动地搬进容器里造成各种水土不服。多阶段构建是解决前端容器化部署的标准答案。一个 Dockerfile两个FROM干净利落。分享 AI、Docker、全栈开发的实战经验把技术讲成人话。

相关新闻

1N系列二极管选型实战指南:从参数解析到电路设计避坑

1N系列二极管选型实战指南:从参数解析到电路设计避坑

1. 项目概述:为什么我们需要一份1N系列二极管型号总结?在电路设计的日常工作中,无论是画原理图、做BOM选型,还是调试维修,二极管都是绕不开的基础元件。而“1N”这个前缀,几乎成了通用二极管的代名词。新手…

2026/7/29 8:57:09阅读更多 →
物联网设备安全连接:PIC18与A5000硬件加密实践

物联网设备安全连接:PIC18与A5000硬件加密实践

1. 物联网安全连接的必要性与挑战 在工业物联网和消费级IoT设备快速普及的今天,安全连接已成为设备上云的刚性需求。我曾参与过多个采用PIC18系列微控制器和A5000加密模块的项目,深刻体会到安全连接不是简单的功能叠加,而是需要从硬件到协议栈…

2026/7/29 8:55:09阅读更多 →
树莓派5部署Stable Diffusion:边缘AI图像生成的轻量化实践

树莓派5部署Stable Diffusion:边缘AI图像生成的轻量化实践

1. 项目概述:当树莓派5遇上Stable Diffusion 最近拿到树莓派5,总想折腾点不一样的。看着网上各种用高性能显卡跑AI画图的视频,我就在想,这台巴掌大的小电脑,能不能也干点“大事”?于是,就有了这…

2026/7/29 8:55:09阅读更多 →
Spring AI中Token成本优化与结构化输出实践

Spring AI中Token成本优化与结构化输出实践

1. Spring AI 中的 Token 成本优化实战在 Spring AI 项目中,Token 成本是直接影响项目经济性的关键指标。以 GPT-3.5 为例,每 1000 个 Token 的成本约为 $0.002,看似微小但在高频调用场景下会快速累积。我在电商客服机器人项目中就曾遇到月均…

2026/7/29 10:17:28阅读更多 →
从“救火队员”到“战略枢纽”:供应链跟单如何实现价值跃迁?

从“救火队员”到“战略枢纽”:供应链跟单如何实现价值跃迁?

每天忙于处理订单延迟、催货、协调异常……这似乎是许多供应链跟单员的日常写照。一个“忙”字,道尽了工作的琐碎与被动。然而,在2026年的今天,随着全球供应链日益复杂和智能化,单纯的“救火”已远远不够。如何从被动的执行者&…

2026/7/29 10:17:28阅读更多 →
AM65xx多协议时间同步架构解析与工业应用实践

AM65xx多协议时间同步架构解析与工业应用实践

1. 项目概述与时间同步的核心价值在工业自动化、汽车电子和物联网这些对时序要求极为严苛的领域,时间同步早已不是“锦上添花”的功能,而是系统能否稳定、可靠、精确运行的“生命线”。想象一下,在一个现代化的智能工厂里,机械臂的…

2026/7/29 10:17:28阅读更多 →
2026论文工具避坑指南[特殊字符]别乱装一堆软件!实测90%同学都用错了✅

2026论文工具避坑指南[特殊字符]别乱装一堆软件!实测90%同学都用错了✅

全能无坑工具直达🌐:https://www.okbiye.com 很多人毕业效率低、论文反复返修,根本不是自己不会写,而是工具用得太杂、太偏、太鸡肋! 写论文要开题、找文献、写综述、改格式、降重润色、画图表、做问卷、整源码&…

2026/7/29 10:17:28阅读更多 →
基于TPS23841的高功率PoE PSE控制器设计实战与PR598参考设计深度解析

基于TPS23841的高功率PoE PSE控制器设计实战与PR598参考设计深度解析

1. 项目概述与核心价值如果你正在设计一款需要为多个网络摄像头、无线接入点或工业物联网网关集中供电的网络交换机或中跨设备,那么“以太网供电”(PoE)技术绝对是绕不开的一环。这项技术的神奇之处在于,它能让一根普通的网线同时…

2026/7/29 10:17:28阅读更多 →
从抖音收藏到本地珍藏:我用这款工具实现了内容自由

从抖音收藏到本地珍藏:我用这款工具实现了内容自由

从抖音收藏到本地珍藏:我用这款工具实现了内容自由 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…

2026/7/29 10:15:27阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“! 在构建复杂的 Agent 系统时,我们经常会遇到这样的场景:Agent 正在执行一个多步骤的任务,比如“下单购买商品”,但执行到一半时,我们…

2026/7/29 0:01:46阅读更多 →
自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

近日,国际专注开放式技术研发的声学品牌Nank南卡,正式官宣实力艺人曾舜晞担任品牌代言人。消息一经发出便轰动全网。为什么耳机品牌不选择流量明星、老牌歌手?而且是选择曾舜晞?让我们一起来探索一下!比起短期的流量&a…

2026/7/29 0:01:46阅读更多 →
【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:01:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/29 4:31:51阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →