从没有终端GUI的桌面文件运行Docker容器?

时间:2018-04-02 16:13:45

标签: bash docker centos7 gnome-terminal gnome-3

我有一些我为此构建的Docker镜像;一个用于扫描程序,另一个用于浏览器等。一旦我让它们工作,我创建了执行bash运行脚本的.desktop文件I&创建了#39;用于运行容器。

我的问题是:有没有办法在没有终端GUI显示的情况下运行.desktop文件?我尝试了几种方法但没有成功。

例如,我尝试过:

[Desktop Entry]
Name=gscan2pdf
Icon=gscan2pdf.png
Exec=gnome-terminal -e 
"/home/hildy/Documents/repos/docker/gscan2pdf/run_gscan.sh"
Type=Application
Terminal=false

以及:

[Desktop Entry]
Name=gscan2pdf
Icon=gscan2pdf.png
Exec="/home/hildy/Documents/repos/docker/gscan2pdf/run_gscan.sh"
Type=Application
Terminal=true

当然这两个脚本都很好地执行脚本,如果在没有首先启动终端GUI的情况下启动应用程序,我会更好。 主机系统: CentOS 7 - Gnome 3桌面

运行脚本的一个示例:

#!/bin/bash

HOST_UID=$(id -u)
HOST_GID=$(id -g)

XSOCK=/tmp/.X11-unix && 
XAUTH=/tmp/.docker.xauth &&

touch $XAUTH &&
xauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge - &&

#These are only run the first time a container is run from the image
#docker run -e NEW_USER="${USER}" -e NEW_UID="${HOST_UID}" -e 
#NEW_GID="${HOST_GID}" hildy/gscan2pdf:v1 
#LAST_CONTAINER=$(docker ps -lq) &&
#docker commit "${LAST_CONTAINER}" hildy/gscan2pdf:v1

docker run \
-ti \
--user $USER \
--privileged \
-v /dev/bus/usb:/dev/bus/usb \
-v $XAUTH:$XAUTH -v $XSOCK:$XSOCK -v /home/$USER:/home/$USER \
-e XAUTHORITY=$XAUTH -e DISPLAY \
--entrypoint "" hildy/gscan2pdf:v1 gscan2pdf &>/dev/null

1 个答案:

答案 0 :(得分:1)

我找到了问题的答案。问题是运行容器的命令包含交互式终端的-i选项。 @sneep在问题的评论中是正确的,当时他说“它应该与终端=假。”。他在脚本中添加一行来创建日志文件的技术也是一种很好的技术,我将来肯定会使用它,这有助于我诊断问题。

我还可以确认,正如@Oleg Skylar所建议的那样,将-it替换为-d用于分离模式。

修改了运行脚本的Docker命令:

docker run \
-t \
--user $USER \
--privileged \
-v /dev/bus/usb:/dev/bus/usb \
-v $XAUTH:$XAUTH -v $XSOCK:$XSOCK -v /home/$USER:/home/$USER \
-e XAUTHORITY=$XAUTH -e DISPLAY \
--entrypoint "" hildy/gscan2pdf:v1 gscan2pdf &>/dev/null

修改后的.desktop文件:

[Desktop Entry]
Name=gscan2pdf
Icon=gscan2pdf.png
Exec=/home/hildy/Documents/repos/docker/gscan2pdf/run_gscan.sh
Type=Application
Terminal=false
StartupNotify=true