从 Heroku 上的 Docker 容器中访问 X-Server
Accessing X-Server from within a Docker container on Heroku
我正在 Docker 容器中将旧的 .NET Web API 应用程序移植到 Heroku 上的 运行。我使用的是单色图像。
这是我的Docker文件:
FROM mono:latest
EXPOSE 5000
ENV PORT 5000
ADD ./ /api
WORKDIR /api
RUN nuget restore -NonInteractive
RUN msbuild webapi.sln /p:Configuration=Release
CMD mono /api/MyProject/bin/Release/MyProject.exe port:$PORT
非常简单,使用最新的 Mono 映像,复制源代码,恢复 NuGet 包,构建解决方案并 运行 它。 $PORT 环境变量由 Heroku 设置或我的本地开发环境默认为 5000。
一切都很好,除了一个生成 PDF 报告的特定 API 控制器。该报告由 PdfSharp 生成,它依赖于 System.Drawing 程序集以进行必要的渲染。然而,这意味着对显示器有依赖性。
当我调用该控制器生成报告时,出现以下错误。
Could not open display (X-Server required. Check your DISPLAY environment variable).
我需要访问 X-Server 才能进行必要的渲染。我尝试了很多东西,但总是卡在这个错误上。
通过安装 Xvfb(虚拟帧缓冲区)实现它的工作,这是一个实现 X11 显示服务器协议的显示服务器。您可以在下面查看更新后的 Dockerfile。
备注:除了显示服务器外,在 Mono 上将 PDFSharp 设置为 运行 时还有更多问题。我还必须更新 apt 源并安装 Microsoft 核心字体,因为我生成的报告使用它们。
我还必须使用知道如何定位字体的 PDFSharp 的修改版本。幸运的是,这已经为我完成了:
https://github.com/daniellor/PDFsharp
相关代码在这里:
https://github.com/daniellor/PDFsharp/blob/master/src/PdfSharp/Fonts/FontLocalizator.cs
有点老套,您可能需要修改它以适应您的设置,但它确实可以。只需创建一个 MonoRelease 构建并引用此程序集,您就可以开始了。
Dockerfile
FROM mono:latest
# Update the sources.list for apt-get so it knows where to download the Microsoft Core fonts.
RUN echo "deb http://gce_debian_mirror.storage.googleapis.com wheezy contrib non-free" >> /etc/apt/sources.list \
&& echo "deb http://gce_debian_mirror.storage.googleapis.com wheezy-updates contrib non-free" >> /etc/apt/sources.list \
&& echo "deb http://security.debian.org/ wheezy/updates contrib non-free" >> /etc/apt/sources.list
# Install Xvfb and the Microsoft core fonts
RUN apt-get update
RUN apt-get install -y xvfb ttf-mscorefonts-installer
# Configure Xvfb as a daemon.
ADD xvfb.init /etc/init.d/xvfb
RUN chmod +x /etc/init.d/xvfb
RUN update-rc.d xvfb defaults
EXPOSE 5000
ENV PORT 5000
ADD ./ /api
WORKDIR /api
RUN nuget restore -NonInteractive
RUN msbuild webapi.sln /p:Configuration=Release
# Start Xvfb and the Web Api
CMD (service xvfb start; export DISPLAY=:10; mono /api/MyProject/bin/Release/MyProject.exe port:$PORT)
xvfb.init
#!/bin/bash
#
# /etc/rc.d/init.d/xvfbd
#
# chkconfig: 345 95 28
# description: Starts/Stops X Virtual Framebuffer server
# processname: Xvfb
#
[ "${NETWORKING}" = "no" ] && exit 0
PROG="/usr/bin/Xvfb"
PROG_OPTIONS=":10 -ac"
PROG_OUTPUT="/tmp/Xvfb.out"
case "" in
start)
echo -n "Starting : X Virtual Frame Buffer "
$PROG $PROG_OPTIONS>>$PROG_OUTPUT 2>&1 &
disown -ar
;;
stop)
echo -n "Shutting down : X Virtual Frame Buffer"
killproc $PROG
RETVAL=$?
[ $RETVAL -eq 0 ] && /bin/rm -f /var/lock/subsys/Xvfb/var/run/Xvfb.pid
echo
;;
restart|reload)
[=11=] stop
[=11=] start
RETVAL=$?
;;
status)
status Xvfb
RETVAL=$?
;;
*)
echo $"Usage: [=11=] (start|stop|restart|reload|status)"
exit 1
esac
exit $RETVAL
我正在 Docker 容器中将旧的 .NET Web API 应用程序移植到 Heroku 上的 运行。我使用的是单色图像。
这是我的Docker文件:
FROM mono:latest
EXPOSE 5000
ENV PORT 5000
ADD ./ /api
WORKDIR /api
RUN nuget restore -NonInteractive
RUN msbuild webapi.sln /p:Configuration=Release
CMD mono /api/MyProject/bin/Release/MyProject.exe port:$PORT
非常简单,使用最新的 Mono 映像,复制源代码,恢复 NuGet 包,构建解决方案并 运行 它。 $PORT 环境变量由 Heroku 设置或我的本地开发环境默认为 5000。
一切都很好,除了一个生成 PDF 报告的特定 API 控制器。该报告由 PdfSharp 生成,它依赖于 System.Drawing 程序集以进行必要的渲染。然而,这意味着对显示器有依赖性。
当我调用该控制器生成报告时,出现以下错误。
Could not open display (X-Server required. Check your DISPLAY environment variable).
我需要访问 X-Server 才能进行必要的渲染。我尝试了很多东西,但总是卡在这个错误上。
通过安装 Xvfb(虚拟帧缓冲区)实现它的工作,这是一个实现 X11 显示服务器协议的显示服务器。您可以在下面查看更新后的 Dockerfile。
备注:除了显示服务器外,在 Mono 上将 PDFSharp 设置为 运行 时还有更多问题。我还必须更新 apt 源并安装 Microsoft 核心字体,因为我生成的报告使用它们。 我还必须使用知道如何定位字体的 PDFSharp 的修改版本。幸运的是,这已经为我完成了:
https://github.com/daniellor/PDFsharp
相关代码在这里:
https://github.com/daniellor/PDFsharp/blob/master/src/PdfSharp/Fonts/FontLocalizator.cs
有点老套,您可能需要修改它以适应您的设置,但它确实可以。只需创建一个 MonoRelease 构建并引用此程序集,您就可以开始了。
Dockerfile
FROM mono:latest
# Update the sources.list for apt-get so it knows where to download the Microsoft Core fonts.
RUN echo "deb http://gce_debian_mirror.storage.googleapis.com wheezy contrib non-free" >> /etc/apt/sources.list \
&& echo "deb http://gce_debian_mirror.storage.googleapis.com wheezy-updates contrib non-free" >> /etc/apt/sources.list \
&& echo "deb http://security.debian.org/ wheezy/updates contrib non-free" >> /etc/apt/sources.list
# Install Xvfb and the Microsoft core fonts
RUN apt-get update
RUN apt-get install -y xvfb ttf-mscorefonts-installer
# Configure Xvfb as a daemon.
ADD xvfb.init /etc/init.d/xvfb
RUN chmod +x /etc/init.d/xvfb
RUN update-rc.d xvfb defaults
EXPOSE 5000
ENV PORT 5000
ADD ./ /api
WORKDIR /api
RUN nuget restore -NonInteractive
RUN msbuild webapi.sln /p:Configuration=Release
# Start Xvfb and the Web Api
CMD (service xvfb start; export DISPLAY=:10; mono /api/MyProject/bin/Release/MyProject.exe port:$PORT)
xvfb.init
#!/bin/bash
#
# /etc/rc.d/init.d/xvfbd
#
# chkconfig: 345 95 28
# description: Starts/Stops X Virtual Framebuffer server
# processname: Xvfb
#
[ "${NETWORKING}" = "no" ] && exit 0
PROG="/usr/bin/Xvfb"
PROG_OPTIONS=":10 -ac"
PROG_OUTPUT="/tmp/Xvfb.out"
case "" in
start)
echo -n "Starting : X Virtual Frame Buffer "
$PROG $PROG_OPTIONS>>$PROG_OUTPUT 2>&1 &
disown -ar
;;
stop)
echo -n "Shutting down : X Virtual Frame Buffer"
killproc $PROG
RETVAL=$?
[ $RETVAL -eq 0 ] && /bin/rm -f /var/lock/subsys/Xvfb/var/run/Xvfb.pid
echo
;;
restart|reload)
[=11=] stop
[=11=] start
RETVAL=$?
;;
status)
status Xvfb
RETVAL=$?
;;
*)
echo $"Usage: [=11=] (start|stop|restart|reload|status)"
exit 1
esac
exit $RETVAL