Локальный драгоценный камень Ruby, действующий в контейнере Docker

#ruby #docker #rubygems #local

#ruby #docker #rubygems #Местные новости

Вопрос:

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

Я извлек некоторые общие функции в локальный драгоценный камень, который работает при локальном запуске приложения Sinatra (это простое приложение Github).

Но когда я пытаюсь запустить контейнер Docker, кажется, что вызовы Gem выполняются только после завершения работы (Ctrl c) приложения (журналы появляются после завершения работы Sinatra).).

Ruby регистрирует изображение Docker

Для создания образа я выполняю следующие действия:

 FROM ruby:slim-buster

ARG GITHUB_APP_IDENTIFIER
ARG GITHUB_WEBHOOK_SECRET
ARG GITHUB_PRIVATE_KEY
ARG ACCESS_TOKEN

RUN apt update amp;amp; apt install -y git --no-install-recommends

COPY LineEnding/line_ending.rb LineEnding/Gemfile LineEnding/Gemfile.lock /line_ending/
COPY github_gem/ /github_gem
WORKDIR /github_gem
RUN gem install bundler amp;amp; bundle install
RUN gem install github_gem-0.1.0.gem
WORKDIR /line_ending
RUN bundle install

ENV GITHUB_APP_IDENTIFIER ${GITHUB_APP_IDENTIFIER}
ENV GITHUB_WEBHOOK_SECRET ${GITHUB_WEBHOOK_SECRET}
ENV GITHUB_PRIVATE_KEY ${GITHUB_PRIVATE_KEY}
ENV ACCESS_TOKEN ${ACCESS_TOKEN}

EXPOSE 3001

CMD ["ruby", "line_ending.rb"]
  

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

введите описание изображения здесь

В качестве еще одной информации я попытался передать журналы в Docker следующим образом:

 def initialize
  docker_stdout = IO.new(IO.sysopen("/proc/1/fd/1", "w"),"w")

  @logger = Logger.new(docker_stdout)
  @logger.level = Logger::DEBUG
end
  

Это не имело никакого значения, как STDOUT, так и docker_stdout ведут себя одинаково.

Полный журнал ошибок:

 [2020-11-17 10:20:48] INFO  WEBrick 1.6.0
[2020-11-17 10:20:48] INFO  ruby 2.7.2 (2020-10-01) [x86_64-linux]
== Sinatra (v2.0.4) has taken the stage on 3001 for development with backup from WEBrick
[2020-11-17 10:20:48] INFO  WEBrick::HTTPServer#start: pid=1 port=3001
D, [2020-11-17T10:21:00.306766 #1] DEBUG -- : request
D, [2020-11-17T10:21:00.308179 #1] DEBUG -- : Authenticate app
D, [2020-11-17T10:21:00.308209 #1] DEBUG -- : 2020-11-17 10:21:00.308206249  0000
D, [2020-11-17T10:21:00.308245 #1] DEBUG -- : 1605608460
D, [2020-11-17T10:21:00.308290 #1] DEBUG -- : 1605609060
D, [2020-11-17T10:21:00.312411 #1] DEBUG -- : Get installation key
WARNING: The preview version of the Integrations API is not yet suitable for production use.
You can avoid this message by supplying an appropriate media type in the 'Accept' request
header.
2020-11-17 10:21:08 - Faraday::ConnectionFailed - Failed to open TCP connection to github.com:443 (getaddrinfo: Temporary failure in name resolution):
    /usr/local/lib/ruby/2.7.0/net/http.rb:960:in `initialize'
    /usr/local/lib/ruby/2.7.0/net/http.rb:960:in `open'
    /usr/local/lib/ruby/2.7.0/net/http.rb:960:in `block in connect'
    /usr/local/lib/ruby/2.7.0/timeout.rb:95:in `block in timeout'
    /usr/local/lib/ruby/2.7.0/timeout.rb:105:in `timeout'
    /usr/local/lib/ruby/2.7.0/net/http.rb:958:in `connect'
    /usr/local/lib/ruby/2.7.0/net/http.rb:943:in `do_start'
    /usr/local/lib/ruby/2.7.0/net/http.rb:932:in `start'
    /usr/local/bundle/gems/faraday-1.1.0/lib/faraday/adapter/net_http.rb:152:in `request_via_request_method'
    /usr/local/bundle/gems/faraday-1.1.0/lib/faraday/adapter/net_http.rb:137:in `request_with_wrapped_block'
    /usr/local/bundle/gems/faraday-1.1.0/lib/faraday/adapter/net_http.rb:128:in `perform_request'
    /usr/local/bundle/gems/faraday-1.1.0/lib/faraday/adapter/net_http.rb:70:in `block in call'
    /usr/local/bundle/gems/faraday-1.1.0/lib/faraday/adapter.rb:61:in `connection'
    /usr/local/bundle/gems/faraday-1.1.0/lib/faraday/adapter/net_http.rb:68:in `call'
    /usr/local/bundle/gems/faraday-1.1.0/lib/faraday/response.rb:11:in `call'
    /usr/local/bundle/gems/faraday-1.1.0/lib/faraday/response.rb:11:in `call'
    /usr/local/bundle/gems/octokit-4.19.0/lib/octokit/middleware/follow_redirects.rb:73:in `perform_with_redirection'
    /usr/local/bundle/gems/octokit-4.19.0/lib/octokit/middleware/follow_redirects.rb:61:in `call'
    /usr/local/bundle/gems/faraday-1.1.0/lib/faraday/request/retry.rb:148:in `call'
    /usr/local/bundle/gems/faraday-1.1.0/lib/faraday/rack_builder.rb:154:in `build_response'
    /usr/local/bundle/gems/faraday-1.1.0/lib/faraday/connection.rb:492:in `run_request'
    /usr/local/bundle/gems/faraday-1.1.0/lib/faraday/connection.rb:279:in `post'
    /usr/local/bundle/gems/sawyer-0.8.2/lib/sawyer/agent.rb:94:in `call'
    /usr/local/bundle/gems/octokit-4.19.0/lib/octokit/connection.rb:156:in `request'
    /usr/local/bundle/gems/octokit-4.19.0/lib/octokit/connection.rb:28:in `post'
    /usr/local/bundle/gems/octokit-4.19.0/lib/octokit/client/apps.rb:78:in `create_app_installation_access_token'
    /usr/local/bundle/gems/github_gem-0.1.0/lib/github_gem.rb:137:in `authenticate_installation'
    line_ending.rb:69:in `block in <class:GHAapp>'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1635:in `call'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1635:in `block in compile!'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1040:in `block in process_route'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1038:in `catch'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1038:in `process_route'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:983:in `block in filter!'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:983:in `each'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:983:in `filter!'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1096:in `block in dispatch!'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1076:in `block in invoke'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1076:in `catch'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1076:in `invoke'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1094:in `dispatch!'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:924:in `block in call!'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1076:in `block in invoke'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1076:in `catch'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1076:in `invoke'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:924:in `call!'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:913:in `call'
    /usr/local/bundle/gems/rack-protection-2.0.4/lib/rack/protection/xss_header.rb:18:in `call'
    /usr/local/bundle/gems/rack-protection-2.0.4/lib/rack/protection/path_traversal.rb:16:in `call'
    /usr/local/bundle/gems/rack-protection-2.0.4/lib/rack/protection/json_csrf.rb:26:in `call'
    /usr/local/bundle/gems/rack-protection-2.0.4/lib/rack/protection/base.rb:50:in `call'
    /usr/local/bundle/gems/rack-protection-2.0.4/lib/rack/protection/base.rb:50:in `call'
    /usr/local/bundle/gems/rack-protection-2.0.4/lib/rack/protection/frame_options.rb:31:in `call'
    /usr/local/bundle/gems/rack-2.0.6/lib/rack/logger.rb:15:in `call'
    /usr/local/bundle/gems/rack-2.0.6/lib/rack/common_logger.rb:33:in `call'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:231:in `call'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:224:in `call'
    /usr/local/bundle/gems/rack-2.0.6/lib/rack/head.rb:12:in `call'
    /usr/local/bundle/gems/rack-2.0.6/lib/rack/method_override.rb:22:in `call'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/show_exceptions.rb:22:in `call'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:194:in `call'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1957:in `call'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1502:in `block in call'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1729:in `synchronize'
    /usr/local/bundle/gems/sinatra-2.0.4/lib/sinatra/base.rb:1502:in `call'
    /usr/local/bundle/gems/rack-2.0.6/lib/rack/handler/webrick.rb:86:in `service'
    /usr/local/lib/ruby/2.7.0/webrick/httpserver.rb:140:in `service'
    /usr/local/lib/ruby/2.7.0/webrick/httpserver.rb:96:in `run'
    /usr/local/lib/ruby/2.7.0/webrick/server.rb:307:in `block in start_thread'
16.85.88.12 - - [17/Nov/2020:10:20:59 UTC] "POST /event_handler HTTP/1.1" 500 190501
- -> /event_handler
^C== Sinatra has ended his set (crowd applauds)
[2020-11-17 10:21:10] INFO  going to shutdown ...
[2020-11-17 10:21:10] INFO  WEBrick::HTTPServer#start done.
[2020-11-17 10:21:10] INFO  WEBrick 1.6.0
[2020-11-17 10:21:10] INFO  ruby 2.7.2 (2020-10-01) [x86_64-linux]
== Sinatra (v2.0.4) has taken the stage on 3001 for development with backup from WEBrick
[2020-11-17 10:21:10] INFO  WEBrick::HTTPServer#start: pid=1 port=3001
^C== Sinatra has ended his set (crowd applauds)
[2020-11-17 10:21:10] INFO  going to shutdown ...
[2020-11-17 10:21:10] INFO  WEBrick::HTTPServer#start done.
D, [2020-11-17T10:21:00.306932 #1] DEBUG -- : ---- get payload
D, [2020-11-17T10:21:00.307577 #1] DEBUG -- : ---- verify webhook signature
D, [2020-11-17T10:21:00.308133 #1] DEBUG -- : ---- received event check_run
D, [2020-11-17T10:21:00.308160 #1] DEBUG -- : ----    action created
D, [2020-11-17T10:21:00.312187 #1] DEBUG -- : ---- authenticate Client
  

Комментарии:

1. На вашем первом скриншоте есть ошибка-обратная трассировка внутри (первые строки), которая показана не полностью. Можете ли вы прикрепить обратную трассировку в виде текста или изображения?

2. Пожалуйста, в виде текста. Не прилагайте скриншоты окон терминала к своим вопросам. Было бы лучше, если бы вы могли заменить приведенные выше изображения на обычный текстовый вывод процесса.

3. Конечно, я это сделаю.

4. В качестве обновления я продолжил тестирование, и приложение все-таки заработало. Также была проблема с сетью. НО ведение журнала по-прежнему происходит в странном порядке. Журналы из gem возвращаются только тогда, когда Sinatra возвращает управление. Нужно ли мне передавать регистратор в драгоценный камень? звучит странно.