docker - 每当我(重新)启动容器时,是否有一种简单的方法可以自动运行脚本?
问题描述
由于这个 Dockerfile 命令,我已经构建了一个 Docker 映像,将一个脚本复制到映像中,并在我运行映像时自动执行它:
ENTRYPOINT ["/path/to/script/my_script.sh"]
(我必须在 RUN 命令中赋予它 chmod 权限才能使其真正运行)
现在,我对 Docker 还是很陌生,所以我不确定我想做的是否是好的实践:
我的基本想法是,当我想运行这个脚本时,我宁愿不必总是创建一个新容器,而是在我(重新)启动同一个容器时找到一种重新执行这个脚本的方法。
因此,不必键入,而是docker run my_image
通过完成相同的操作docker (re)start container_from_image
。
有没有一种简单的方法可以做到这一点,从资源节约的角度来看它是否有意义?
解决方案
docker run
相当便宜,典型的 Docker 模型通常是你总是从“白板”开始,然后从那里开始设置。Docker 容器没有与 systemd 作业相同的一组 pre-start/post-start/... 钩子;只有 ENTRYPOINT/CMD 机制。你现在拥有的东西是正常的。
还要记住,您需要删除和重新创建容器以进行各种例行更改,最重要的长期是您必须删除容器才能更改底层映像(因为已安装的软件或基础 Linux 发行版具有关键的你需要修复的错误)。我觉得围绕docker build
/ run
/ stop
/构建的工作流rm
是“最 Dockery”,并且非常适合不可变基础架构模式。重复docker stop
/start
作为一个工作流程感觉就像你试图让这个特定的容器保持活力,在大多数情况下,这并不重要。
从技术的角度来看,您可以考虑容器环境及其文件系统,以及容器内部的主进程。 docker run
实际上是docker create
加号docker start
。我从未注意到其中的“创建”一半需要花费大量时间,但是如果您正在执行诸如启动 JVM 或在启动时加载大型数据集之类的操作,则“启动”一半将很慢,无论它是否与创建相结合一个新的容器。
推荐阅读
- python-2.7 - Scrapy:使用项目加载器返回新 CSV 行中的每个项目
- css - Bootstrap 4中不需要的导航栏透明度
- java - JUnit 测试 public boolean equals(Object obj)
- android - Android - 以编程方式创建的广播接收器导出
- .net - Azure 函数自定义类请求正文 - 无无参数构造函数/无效的强制转换字符串 -> guid
- hibernate - 如何使用 spring 验证器验证多个 POJO?
- php - PHP PDO 'SQLSTATE[HY093]:参数号无效:参数未定义
- javascript - 使用 VueJS 时挂载组件失败
- double - Android Studio 在 Operands.DOUBLE 上显示错误
- c#-4.0 - 在 BrightPearl API 上搜索订单