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:07 阅读更多 →
嵌入式Linux开发网络互通:路由器、USB共享与直连方案详解

嵌入式Linux开发网络互通:路由器、USB共享与直连方案详解

1. 项目概述:为什么网络互通是嵌入式开发的“生命线”刚拿到一块嵌入式开发板,烧录好系统,串口终端里看到熟悉的Linux登录提示,这感觉就像给一台新电脑装好了操作系统。但兴奋劲没过,一个现实问题就摆在了面前&#xf…

2026/7/29 8:56:06 阅读更多 →
书法美术品牌推荐

书法美术品牌推荐

家有 4 - 12 岁娃的家长们,是不是都在纠结给孩子选个合适的书法美术培训机构?毕竟这个年龄段是孩子观察力、想象力和手部控制能力发展的关键阶段,也是养成良好书写习惯和审美意识的重要时期。今天就结合家长们常见的关心点,给大家…

2026/7/29 8:56:06 阅读更多 →

最新新闻

STM32驱动OLED实战:从I2C通信到动态界面与性能优化

STM32驱动OLED实战:从I2C通信到动态界面与性能优化

1. 从点亮到炫技:为什么STM32驱动OLED是嵌入式入门的必修课如果你刚开始玩STM32,点亮一个LED灯可能是你的第一个“Hello World”。但很快你就会发现,那个闪烁的小灯带来的成就感,远不如在一块小小的OLED屏幕上看到自己绘制的图形、…

2026/7/29 9:05:10 阅读更多 →
从零构建电子足球机器人:STM32与PID控制实战指南

从零构建电子足球机器人:STM32与PID控制实战指南

1. 项目概述:从“踢球”到“造球”的思维跃迁 “电子足球”这个名字,乍一听可能让人联想到FIFA、实况这类电子游戏。但今天要聊的,完全不是一回事。这是一个典型的创客比赛项目,它的核心不是操控屏幕里的虚拟球员,而是…

2026/7/29 9:05:09 阅读更多 →
炉石传说终极优化插件:用HsMod彻底改变你的游戏体验

炉石传说终极优化插件:用HsMod彻底改变你的游戏体验

炉石传说终极优化插件:用HsMod彻底改变你的游戏体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 你是否厌倦了炉石传说中那些重复繁琐的操作?想要在酒馆战棋中更…

2026/7/29 9:05:09 阅读更多 →
.NET日志框架设计与实现:从原理到实践

.NET日志框架设计与实现:从原理到实践

1. 日志框架在.NET诊断中的核心价值日志记录是.NET应用诊断的基石。一个设计良好的日志系统能帮助开发者快速定位线上问题、分析系统行为、监控应用健康状态。在15年的.NET开发实践中,我见过太多因为日志缺失或设计不当导致的"午夜惊魂"——凌晨三点被报警…

2026/7/29 9:05:09 阅读更多 →
C++双栈实现队列:LeetCode 232题详解与工程实践

C++双栈实现队列:LeetCode 232题详解与工程实践

1. 项目概述:当栈遇上队列 在数据结构的世界里,栈和队列是两种最基础、也最经典的结构。栈是“后进先出”(LIFO),像一摞盘子,你只能从最上面取放;队列是“先进先出”(FIFO&#xff0…

2026/7/29 9:05:09 阅读更多 →
DDR3/DDR4接口:时序坍缩、端接失配与Skew预算的残酷真相

DDR3/DDR4接口:时序坍缩、端接失配与Skew预算的残酷真相

I2C、UART、以太网、多器件级联时序之后,本篇聚焦 FPGA 高速 DDR 存储底层 SI/PI 时序真相。高速 DDR 时序窗口极易被各类损耗持续压缩,仅靠初始化校准无法保证量产稳定。文章从 PCB 拓扑、动态端接、初始化排障、时序预算、量产验证五大维度&#xff0c…

2026/7/29 9:04:09 阅读更多 →

日新闻

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

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

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

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻