docker - 要在 Docker 上交付并避免累积映像,必须做些什么?
问题描述
我使用 Docker 来执行我制作的网站。当必须交付一个版本时,我必须构建一个新的 Docker 映像并从中启动一个新的容器。
问题是图像和容器正在累积并占用巨大的空间。除了交付之外,我还需要停止正在运行的容器并删除它以及源图像。
我不需要 Docker 命令行,只需要一个清单或一个流程,以免忘记任何事情。
例如: - 停止运行容器 - 删除停止的容器 - 删除旧镜像 - 构建新镜像 - 启动新容器
我错过了什么吗?我不习惯 Docker,也许这个非常经典的用例有最佳实践?
解决方案
适合我的本地工作流程是:
在本地进行核心开发,无需 Docker。诸如交互式调试器和实时重新加载之类的东西在非 Docker 环境中工作得很好,没有奇怪的黑客或 root 访问权限,并且安装我需要的工具通常只需要一个
brew
或一个apt-get
步骤。让我所有的 pytest/junit/rspec/jest/... 测试通过。docker build
一个新的形象。docker stop && docker rm
旧容器。docker run
一个新的容器。当旧图像的数量开始困扰我时,
docker system prune
.
如果您使用的是 Docker Compose,则可以将中间的一组步骤替换为docker-compose up --build
.
在生产环境中,顺序略有不同:
当你的 CI 系统看到一个新的提交时,在运行存储库的本地测试之后,它
docker build && docker push
是一个新的图像。图像具有唯一标签,可以是时间戳或源代码管理提交 ID 或版本标签。您的部署系统(可以是 CI 系统或单独的 CD 系统)告诉您正在使用的任何集群管理器(Kubernetes、带有 Docker Swarm 的 Compose 文件、Nomad、Ansible 剧本……)关于新版本标签的信息。部署系统负责停止、启动和删除容器。
如果您的集群管理器尚未处理此问题,请运行 cron 作业以
docker system prune
.
推荐阅读
- javascript - 你如何从 React with Meteor 切换到 Preact?
- php - 用例的对象或数组
- python - 有没有办法用 python 捕获 selenium 请求标头?
- html - 表 td,不同的 div 高度垂直对齐顶部
- swift - 在 Swift 中函数调用后的代码块中做什么?
- python - python读取文本文件并添加字符串并创建新的txt文件
- rest - 使用 JSON REST API 时如何在 Jenkins 中过滤具有作业名称的作业?
- angular - 双击内联编辑页面导航问题
- python - 如何在 NEST 模拟器中设置 Connection 的突触类型?
- javascript - 使用异步/回调来获取数据?