首页 > 解决方案 > 每当我(重新)启动容器时,是否有一种简单的方法可以自动运行脚本?

问题描述

由于这个 Dockerfile 命令,我已经构建了一个 Docker 映像,将一个脚本复制到映像中,并在我运行映像时自动执行它:

ENTRYPOINT ["/path/to/script/my_script.sh"]

(我必须在 RUN 命令中赋予它 chmod 权限才能使其真正运行)

现在,我对 Docker 还是很陌生,所以我不确定我想做的是否是好的实践:

我的基本想法是,当我想运行这个脚本时,我宁愿不必总是创建一个新容器,而是在我(重新)启动同一个容器时找到一种重新执行这个脚本的方法。

因此,不必键入,而是docker run my_image通过完成相同的操作docker (re)start container_from_image

有没有一种简单的方法可以做到这一点,从资源节约的角度来看它是否有意义?

标签: docker

解决方案


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 或在启动时加载大型数据集之类的操作,则“启动”一半将很慢,无论它是否与创建相结合一个新的容器。


推荐阅读