在成功关注这些RHEL systemd container instructions之后,我'd now like the container, every time it starts, to run a bash script. However, I' d喜欢它来运行 only once . 那不想启动容器,然后手动运行bash脚本(例如,docker exec -it ...) . 我应该创建一个systemd单元文件来启动脚本,然后在我的bash脚本中禁用该服务吗?这看起来有点像黑客,不是吗?
更新:要回答评论者,bash脚本需要systemd . 因此,首先必须启动systemd,然后运行脚本,安装软件,然后发出systemctl start命令 . 是的,我知道你在想什么:使用RUN安装软件然后让systemd启动它,但不幸的是,我不能为这个项目做到这一点 . 我没写过的脚本希望systemd能够运行 . 此外,该脚本确实在容器内,在命名卷中运行 .
3 回答
您可以为bash脚本创建服务类型
oneshot
的systemd单元文件 .oneshot
类型表示短期进程,通常作为一次性任务运行 . systemd在继续使用其他单元之前等待进程退出 .例如,
请注意,如果希望systemd在启动操作成功完成后将服务视为活动,则必须将
RemainAfterExit
设置为true
.看一下systemd docs中的例2和例3 .
如果您只需要"systemd"因为安装程序运行"systemctl start"命令,那么您可以通过使用systemctl-docker-replacement包装器来避免模糊 .
我经常使用它来覆盖/ usr / bin / systemctl,在这种情况下,“systemctl start”正确执行,而不运行任何systemd守护程序 . 经过大量安装程序测试,以模仿他们期望从“systemctl start”开始的行为 .
您可以在同一服务中执行此操作 . 在我的机器上考虑以下流程
如你所见,我在后台执行了一个命令(-d / - exec命令的分离)
所以在你的服务文件中 . 只需在主机中定义
ExecStartPost=
即可启动docker容器并使用exec
与-d
标志