Как найти журналы ошибок, когда мое докеризованное блестящее приложение не работает

Я пытаюсь поместить свое блестящее приложение в контейнер докеров. Мое блестящее приложение отлично работает на моем локальном компьютере. Но после докеризации моего блестящего приложения у меня всегда появляется сообщение об ошибке на моем локальном хосте, например 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

Вы заметили какую-либо ошибку при построении образа?

minhazur 29.06.2019 04:11

Я не заметил никакой ошибки. все выглядит хорошо.

zesla 29.06.2019 04:12

Не могли бы вы пересобрать образ, удалив --no-verbose после wget, и посмотреть результат?

minhazur 29.06.2019 04:15

Я дам ему попробовать. Но дело в том, что я использовал тот же файл док-станции для очень простого приложения, и оно работает... так что это должно быть что-то о моем приложении. Но с моим приложением все в порядке, когда я запускаю его локально. так что я запутался, трачу часы, чтобы понять это, но не смог....

zesla 29.06.2019 04:19

Возможно, у вас запущена другая служба (может быть, ваше собственное приложение или, например, служба nginx или apache), использующая/резервирующая этот порт 80 вашего хоста, что не позволяет докеру запускать ваш контейнер с тем же портом. Взгляните на мой ответ здесь для более подробной информации.

SalDevOps 29.06.2019 04:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
5
973
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обычно журналы для любого (живого или мертвого) контейнера можно найти, просто используя:

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*****)

Другие вопросы по теме