首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Docker中与systemd一起运行自定义脚本?

在Docker中与systemd一起运行自定义脚本?
EN

Stack Overflow用户
提问于 2021-05-04 06:07:45
回答 1查看 41关注 0票数 0

如何在Docker中与标准systemd或/sbin/init进程一起启动自定义脚本?

我正在尝试为Gnome桌面设置一个GUI测试,并且我有一个Gnome桌面可以在Docker中完美地运行。我还有一个很好的Python脚本,可以单击小部件并验证功能。

唯一的限制是我必须手动连接到运行在Docker中的VNC服务器,才能连接到桌面并启动脚本。我想在CI服务器上自动运行它,所以我不能有任何手动步骤。

但是,我找不到任何方法来修改我的Docker文件来运行自定义脚本。

我的Dockerfile有一个简单的CMD ["/start.sh"]来启动主进程,它最初只是:

代码语言:javascript
运行
复制
#!/bin/bash
exec /sbin/init

所以我试着把它改成:

代码语言:javascript
运行
复制
#!/bin/bash
exec /sbin/init &
cd /home/default/shared; ./run_tests.py

但是,/sbin/init行失败,并显示以下错误:

代码语言:javascript
运行
复制
Couldn't find an alternative telinit implementation to spawn.

我使用以下命令运行我的Docker容器:

代码语言:javascript
运行
复制
docker run -it --name=my-gnome-desktop --rm \
--tmpfs /run --tmpfs /run/lock --tmpfs /tmp \
--cap-add SYS_BOOT --cap-add SYS_ADMIN \
-v /sys/fs/cgroup:/sys/fs/cgroup \
-v "$(pwd)/testing:/home/default/shared" \
-p 5901:5901 -p 6901:6901 \
my-gnome-desktop-image

如果我使用bash运行此命令,例如

代码语言:javascript
运行
复制
docker run -it --name=my-gnome-desktop --rm \
--tmpfs /run --tmpfs /run/lock --tmpfs /tmp \
--cap-add SYS_BOOT --cap-add SYS_ADMIN \
-v /sys/fs/cgroup:/sys/fs/cgroup \
-v "$(pwd)/testing:/home/default/shared" \
-p 5901:5901 -p 6901:6901 \
my-gnome-desktop-image /bin/bash

然后,我可以通过运行exec /sbin/init vs exec /sbin/init &手动重现这些行为。

我将包含测试脚本的本地./testing文件夹挂载为卷,这样就不必在每次调整测试时重新构建映像。我只是杀死并重新运行容器。

如何同时运行启动桌面的/sbin/init和我的测试脚本?

我考虑将我的脚本重构为自动启动的系统守护进程,但它需要以默认用户身份运行,并且需要在X服务器启动后运行。

编辑:

我尝试将脚本重写为init.d守护进程,如下所示:

代码语言:javascript
运行
复制
cd /home/default/shared
ln -s $(pwd)/run_tests.sh /etc/init.d/
chmod 755 /etc/init.d/run_tests.sh
ln -s /etc/init.d/run_tests.sh /etc/rc2.d/S99run_tests
sudo update-rc.d run_tests.sh defaults
exec /sbin/init

但这不起作用,显示错误:

代码语言:javascript
运行
复制
[FAILED] Failed to start run_tests.service.
See 'systemctl status run_tests.service' for details.

但是,systemctl status run_tests.service显示的唯一附加详细信息是:

代码语言:javascript
运行
复制
 Warning: some journal files were not opened due to to insufficient permissions
EN

回答 1

Stack Overflow用户

发布于 2021-05-05 09:44:53

除此之外,我找不到任何简单的方法来修改exec /sbin/init以并行运行单独的进程。但是,我确实发现我正在运行的VNC服务器正在执行一个易于修改的xstartup.sh脚本。

该脚本的末尾是:

代码语言:javascript
运行
复制
dbus-launch --exit-with-session gnome-session

这实际上启动了Gnome环境,然后阻塞。我发现我可以在这个脚本中启动一个单独的进程,只需在最后一行之前放入类似nohup my_script.sh &的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67376407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档