systemd容器:我怎样才能自动运行一个bash脚本?

在成功地遵循这些RHEL系统容器指令之后 ,我现在每次启动时都会喜欢容器来运行bash脚本。 不过,我只想运行一次 。 这对我来说似乎不是一种“服务”。 我不想启动容器,然后手动运行bash脚本(例如,docker exec -it …)。 我应该让systemd单元文件启动脚本,然后禁用我的bash脚本中的服务? 这似乎有点像黑客,不是吗?

更新:要回答评论者,bash脚本需要systemd。 因此,首先systemd必须启动,然后脚本运行,安装软件,然后发出systemctl启动命令。 是的,我知道你在想什么:使用RUN安装软件,然后让systemd启动它,但不幸的是,我不能这样做这个项目。 我没写的脚本预计systemd将会运行。 此外,该脚本在容器中运行,在命名卷中。

你可以为你的bash脚本创build一个服务typesoneshot的systemd单元文件。 oneshottypes代表的是短命的过程,通常作为一次性的任务来运行。 systemd等待进程退出,然后继续与其他单位。

例如,

 [Unit] Description=my only-once script [Service] Type=oneshot ExecStart=/bin/bash /path/to/only_once_script.sh RemainAfterExit=true StandardOutput=journal [Install] WantedBy=multi-user.target 

请注意,如果您希望systemd在启动操作成功完成后将服务视为活动 ,则RemainAfterExit必须设置为true

看看systemd 文档中的示例2示例3

如果你只是需要“systemd”,因为安装程序运行“systemctl start”命令,那么你可以通过使用systemctl-docker-replacement包装来避免模糊。

我regurlarly使用它来覆盖/ usr / bin / systemctl在这种情况下“systemctl启动”正确执行没有任何systemd守护进程运行。 testing了相当多的安装程序来模仿他们期望从“systemctl start”期望的行为。

你可以在同一个服务中做到这一点。 考虑我的机器上的下面的stream程

 $ docker run -d ubuntu:16.04 sleep 200 2e76d13cee285143dc91af0e6ddbd51bd31e92d7baa3ec34638726cdd0abb572 $ docker exec -d 2e76d13cee285143dc91af0e6ddbd51bd31e92d7baa3ec34638726cdd0abb572 sleep 300 $ docker exec 2e76d13cee285143dc91af0e6ddbd51bd31e92d7baa3ec34638726cdd0abb572 ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.2 0.0 4384 756 ? Ss 12:25 0:00 sleep 200 root 5 0.1 0.0 4384 792 ? Ss 12:25 0:00 sleep 300 root 9 0.0 0.2 34428 2740 ? Rs 12:25 0:00 ps aux 

正如你所看到的,我在后台执行了一个命令(-d / – detach of exec command)

所以在你的服务文件。 只需在ExecStartPost=容器的主单元中定义ExecStartPost= ,并使用带-d标志的exec