有什么简单的方法可以在我(重新)启动容器时自动运行脚本吗?

时间:2019-06-11 08:59:32

标签: docker

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

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

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

现在,我对Docker还是很陌生,所以我不确定我想做的事是否甚至是好的做法:

我的基本想法是,当我想运行此脚本时,我宁愿不必总是创建一个新的容器,而是想办法在我重新启动同一容器时重新执行此脚本。 / p>

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

对于chmod问题,您可以执行以下操作

Predicate Pred

有关重新运行脚本的问题

COPY . /path/to/script/my_script.sh RUN chmod 777 -R /path/to/script/my_script.sh 指定在容器启动时始终执行的命令。

可以是

ENTRYPOINT

docker run container_from_image

因此,只要您的容器启动,您的docker start container_from_image 命令就会被执行。

您可以参考this以获得更多详细信息