当我的 dockerized shiny 应用程序不起作用时如何查找错误日志

How to find error logs when my dockerized shiny app does not work

我正在尝试将我闪亮的应用程序放入 docker 容器中。我闪亮的应用程序在我的本地计算机上运行良好。但是在 docker 启动我闪亮的应用程序后,我的本地主机上总是有错误消息,例如 The application failed to start. The application exited during initialization.

我不知道为什么会这样。我是 docker 的新手。当我 运行 图像 docker 时,如何找到错误日志?我需要日志才能知道出了什么问题。

这是我的码头文件:

# Install R version 3.6
FROM r-base:3.6.0

# Install Ubuntu packages
RUN apt-get update && apt-get install -y \
    sudo \
    gdebi-core \
    pandoc \
    pandoc-citeproc \
    libcurl4-gnutls-dev \
    libcairo2-dev/unstable \
    libxt-dev \
    libssl-dev

# Download and install ShinyServer (latest version)
RUN wget --no-verbose https://s3.amazonaws.com/rstudio-shiny-server-os-build/ubuntu-12.04/x86_64/VERSION -O "version.txt" && \
    VERSION=$(cat version.txt)  && \
    wget --no-verbose "https://s3.amazonaws.com/rstudio-shiny-server-os-build/ubuntu-12.04/x86_64/shiny-server-$VERSION-amd64.deb" -O ss-latest.deb && \
    gdebi -n ss-latest.deb && \
    rm -f version.txt ss-latest.deb

# Install R packages that are required
# TODO: add further package if you need!
RUN R -e "install.packages(c( 'tidyverse', 'ggplot2','shiny','shinydashboard', 'DT', 'plotly', 'RColorBrewer'), repos='http://cran.rstudio.com/')"
# Copy configuration files into the Docker image
COPY shiny-server.conf  /etc/shiny-server/shiny-server.conf
COPY /app /srv/shiny-server/

# Make the ShinyApp available at port 80
EXPOSE 80

# Copy further configuration files into the Docker image
COPY shiny-server.sh /usr/bin/shiny-server.sh

CMD ["/usr/bin/shiny-server.sh"]

我构建了图像并且 运行 如下所示:

docker build -t myshinyapp .
docker run -p 80:80 myshinyapp

通常任何(活的或死的)容器的日志都可以通过以下方式找到:

docker logs full-container-name

docker logs CONTAINERID

(替换容器的实际 ID)

如前所述,即使对于已停止(尚未删除)的容器,这通常也能正常工作,您可以列出:

docker container ls -a

或者只是

docker ps -a

但是,有时您甚至没有日志,因为根本没有创建容器(根据经验,我认为这更适合您的情况)

这可能只是因为 docker 引擎无法分配您的服务定义要求可用的所有资源。

The application failed to start. The application exited during initialization

通常反映您的 docker 引擎无法获得所需的资源。

最常见的情况就是您的主机端口:

如果您有其他服务(docker化或未化)使用(例如)您要用于服务的端口(在您的情况下为端口 80),则 Docker将无法启动您的容器。

所以...简而言之...解决这种情况的最简单方法(也是您遇到此类问题时的第一次尝试)就是绑定主机的任何其他端口(例如:8080), 到您的服务将在内部(在您的容器内)侦听的那个 80 端口:

docker run -p 8080:80 myshinyapp

同样的原则适用于不可分配的卷(例如:尝试将一个卷绑定为主机中实际上不存在的read-only)


顺便说一句comment/trick:

由于您没有为容器设置名称,因此在查找其日志时需要使用容器 ID。

但不用输入(或 copy-pasting)完整的容器 ID(通常类似于:1283c66babea 甚至更大),您可以只输入几个前几位数字,它仍然会按预期工作:

docker logs 1283c6docker logs 1283 甚至 docker logs 128

(当然...只要你没有其他128*****容器)