Как запустить приложение Rails в Docker на Heroku - PullRequest
0 голосов
/ 15 апреля 2019

Я перемещаю устаревшее приложение rails для запуска в докере. Он работает локально и в Virtualbox, однако, если его отправить в Heroku, это не удастся.

Если я зайду в контейнер, я смогу запустить rails c очень хорошо. Однако это не запустится. У кого-нибудь есть идеи?

2019-04-15T15:45:36.575923+00:00 heroku[web.1]: Starting process with command `/bin/bash -c \[\"rails\",\ \"server\",\ \"-b\",\ \"0.0.0.0\",\ \"-p\",\ \44429\]`
2019-04-15T15:45:38.700762+00:00 heroku[web.1]: State changed from starting to crashed
2019-04-15T15:45:38.616281+00:00 app[web.1]: /bin/bash: [rails,: command not found
2019-04-15T15:45:38.681262+00:00 heroku[web.1]: Process exited with status 127

Dockerfile

Вот мой Dockerfile, я изначально думал, что он получал ошибку, потому что он использовал /bin/sh вместо /bin/bash. Я добавил строку, чтобы установить SHELL для bash, но она все еще получает ошибку.

FROM ruby:2.3.8

ARG RAILS_SECRET_KEY
ARG RAILS_ENV=staging
ARG GITHUB_REPO_API_TOKEN
ARG POSTGRES_USER
ARG POSTGRES_PASSWORD
ARG POSTGRES_DB
ARG DATABASE_HOST
ARG FOG_PROVIDER
ARG FOG_REGION
ARG ASSET_FOG_DIRECTORY
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
ARG DONT_INIT
ARG PORT

# change bin/sh to /bin/bash
SHELL ["/bin/bash", "-c"]

# Most of these deps are for running JS tests. You can add whatever extra deps your project has (ffmpeg, imagemagick, etc)
RUN apt-get update

RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends \
  nodejs \
  qt5-default \
  libqt5webkit5-dev \
  xvfb \
  postgresql \
  postgresql-contrib \
  imagemagick \
  openjdk-8-jdk

# cache the gemfile seperate
COPY Gemfile* /usr/src/app/

# required at CLI
ENV BUNDLE_GITHUB__COM=${GITHUB_REPO_API_TOKEN}:x-oauth-basic

# You'll need something here. For development, you don't need anything super secret.
ENV SECRET_KEY_BASE=${RAILS_SECRET_KEY}

# this tells container to cd into app directory
WORKDIR /usr/src/app

# so we don't have to reinstall all the gems when we add just one when we build a new container
ENV BUNDLE_PATH /gems

RUN bundle install

# copy app dir into /usr/src/app in container
COPY . /usr/src/app/

RUN DB_ADAPTER=nulldb bundle exec rake assets:precompile

# for the irritating times the server doesn't clean up when container shutsdown
ENTRYPOINT ["./docker-entrypoint.sh"]

CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0", "-p", $PORT]

Обновление

Докер-EntryPoint

#!/bin/bash
set -e

if [ -f tmp/pids/server.pid ]; then
  rm tmp/pids/server.pid
fi

exec "$@"

1 Ответ

1 голос
/ 17 апреля 2019

Возможно, вам потребуется выполнить команду CMD в оболочке в форме, подобной

CMD bundle exec rails server -b 0.0.0.0 -p $PORT

Поскольку она будет выполняться как /bin/bash -c {CMD}, но /bin/bash -c ["bundle", "exec", "rails", "server", "-b", "0.0.0.0", "-p", $PORT] не является допустимой командой.

Также вы можете (не требуется в данном конкретном случае) установить BUNDLE_BIN переменную env вместе с BUNDLE_PATH

ENV BUNDLE_PATH=/gems \
    BUNDLE_BIN=/gems/bin \
    GEM_HOME=/gems
ENV PATH="${BUNDLE_BIN}:${PATH}"

Это разрешит командубез bundle exec для правильной работы тоже

CMD rails server -b 0.0.0.0 -p $PORT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...