Я пытаюсь поместить свое блестящее приложение в контейнер докеров. Мое блестящее приложение отлично работает на моем локальном компьютере. Но после докеризации моего блестящего приложения у меня всегда появляется сообщение об ошибке на моем локальном хосте, например The application failed to start. The application exited during initialization..
Я понятия не имею, почему это происходит. Я новичок в докере. Как найти журналы ошибок при запуске образа докера? Мне нужен журнал, чтобы знать, что пошло не так.
Вот мой док-файл:
# 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
Я не заметил никакой ошибки. все выглядит хорошо.
Не могли бы вы пересобрать образ, удалив --no-verbose после wget, и посмотреть результат?
Я дам ему попробовать. Но дело в том, что я использовал тот же файл док-станции для очень простого приложения, и оно работает... так что это должно быть что-то о моем приложении. Но с моим приложением все в порядке, когда я запускаю его локально. так что я запутался, трачу часы, чтобы понять это, но не смог....
Возможно, у вас запущена другая служба (может быть, ваше собственное приложение или, например, служба nginx или apache), использующая/резервирующая этот порт 80 вашего хоста, что не позволяет докеру запускать ваш контейнер с тем же портом. Взгляните на мой ответ здесь для более подробной информации.





Обычно журналы для любого (живого или мертвого) контейнера можно найти, просто используя:
docker logs full-container-name
или
docker logs CONTAINERID
(заменяя фактический идентификатор вашего контейнера)
Как было сказано ранее, это обычно работает даже для остановленных (еще не удаленных) контейнеров, которые вы можете перечислить с помощью:
docker container ls -a
или просто
docker ps -a
Однако иногда у вас даже лога не будет, так как контейнер вообще никогда не создавался (что я думаю, по опыту, больше подходит к вашему случаю)
И это может происходить просто из-за того, что механизм Docker не может выделить все ресурсы, которые требуются вашему определению службы.
The application failed to start. The application exited during initialization
обычно отражает то, что ваш движок докера не может получить необходимые ресурсы.
И самый распространенный случай для этого так же прост, как ваш хост-порты:
Если у вас есть другая служба (докеризированная или нет), использующая (например) тот порт, который вы хотите использовать для своей службы (в вашем случае порт 80), тогда Docker просто не сможет запустить ваш контейнер.
Итак... вкратце... самое простое решение для этой ситуации (и ваша первая попытка, когда вы сталкиваетесь с такими проблемами) - просто привязать любой другой порт вашего хоста (скажем: 8080) к тому порту 80, который ваш service будет слушать внутренне (внутри вашего контейнера):
docker run -p 8080:80 myshinyapp
Тот же принцип применяется к томам нераспределяемый (например, попытка привязать том как доступный только для чтения, который на самом деле не существует на хосте).
В качестве комментария/трюка:
Поскольку вы не устанавливаете имя для своего контейнера, вам нужно будет вместо этого использовать идентификатор контейнера при поиске его журналов.
Но вместо того, чтобы вводить (или копировать) полный идентификатор контейнера (обычно что-то вроде: 1283c66babea или даже больше), вы можете просто ввести несколько первых цифр, и он все равно будет работать так, как ожидалось:
docker logs 1283c6 или docker logs 1283 или даже docker logs 128
(конечно... если у вас нет другого контейнера 128*****)
Вы заметили какую-либо ошибку при построении образа?