由于使用了Dockerfile命令,我已经构建了一个Docker映像,将脚本复制到该映像中,并在运行该映像时自动执行该脚本:
ENTRYPOINT ["/path/to/script/my_script.sh"]
(我必须在RUN命令中为其赋予chmod权限才能真正使其运行)
现在,我对Docker还是很陌生,所以我不确定我想做的事是否甚至是好的做法:
我的基本想法是,当我想运行此脚本时,我宁愿不必总是创建一个新的容器,而是想办法在我重新启动同一容器时重新执行此脚本。 / p>
因此,不必键入docker run my_image
,而是通过docker (re)start container_from_image
完成相同操作。
有没有简单的方法可以做到这一点,从资源简约的角度来看,这是否有意义?
答案 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以获得更多详细信息