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

Run a Docker Container from a Desktop File Without Terminal GUI?

我有几个 Docker 我为此和那个构建的图像;一个用于扫描程序,另一个用于浏览器等。一旦我让它们工作,我创建了 .desktop 文件来执行bash 运行 个我创建的脚本 运行 一个包含它们的容器。

我的问题是:有没有办法在不显示终端 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

我找到了问题的答案。问题是 运行 容器的命令包含交互式终端的 -i 选项。 @sneep 在对问题的评论中是正确的,他说 "It should work with Terminal=false." 他在脚本中添加一行以创建日志文件的技术也是一项很棒的技术,我将来肯定会使用它,它对我有帮助诊断问题。

我还可以确认,按照@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