Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Heroku上的Docker容器中访问X-Server_Docker_Heroku_Mono - Fatal编程技术网

从Heroku上的Docker容器中访问X-Server

从Heroku上的Docker容器中访问X-Server,docker,heroku,mono,Docker,Heroku,Mono,我正在移植一个旧的.NETWebAPI应用程序,以便在Docker容器中的Heroku上运行。我用的是单声道图像 这是我的Dockerfile: 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

我正在移植一个旧的.NETWebAPI应用程序,以便在Docker容器中的Heroku上运行。我用的是单声道图像

这是我的Dockerfile:

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生成,PdfSharp依赖于System.Drawing程序集进行必要的渲染。然而,这意味着对显示器具有依赖性

当我调用该控制器生成报告时,我得到以下错误

Could not open display (X-Server required. Check your DISPLAY environment variable).

我需要访问X服务器才能进行必要的渲染。我尝试了很多方法,但总是遇到这个错误。

通过安装Xvfb(虚拟帧缓冲区),一个实现X11显示服务器协议的显示服务器,使其正常工作。您可以查看下面更新的Dockerfile

备注:除了显示服务器之外,让PDFSharp在Mono上运行还有更多问题。我还必须更新apt源代码并安装Microsoft Core字体,因为我生成的报告使用它们。 我还必须使用PDFSharp的修改版本,它知道如何定位字体。幸运的是,我已经做到了:

相关代码如下:

有点黑,你可能需要修改它,以适应你的设置,但它做的工作。只要创建一个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 "$1" 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)
        $0 stop
        $0 start
        RETVAL=$?
        ;;
    status)
        status Xvfb
        RETVAL=$?
        ;;
    *)
     echo $"Usage: $0 (start|stop|restart|reload|status)"
     exit 1
esac

exit $RETVAL

通过安装Xvfb(虚拟帧缓冲区)使其正常工作,Xvfb是一个实现X11显示服务器协议的显示服务器。您可以查看下面更新的Dockerfile

备注:除了显示服务器之外,让PDFSharp在Mono上运行还有更多问题。我还必须更新apt源代码并安装Microsoft Core字体,因为我生成的报告使用它们。 我还必须使用PDFSharp的修改版本,它知道如何定位字体。幸运的是,我已经做到了:

相关代码如下:

有点黑,你可能需要修改它,以适应你的设置,但它做的工作。只要创建一个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 "$1" 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)
        $0 stop
        $0 start
        RETVAL=$?
        ;;
    status)
        status Xvfb
        RETVAL=$?
        ;;
    *)
     echo $"Usage: $0 (start|stop|restart|reload|status)"
     exit 1
esac

exit $RETVAL