Развертывание Rails с помощью docker-compose, assets не работает


Это чрезвычайно полезная статья, которой я следовал:

Докер для существующего приложения Rails

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

Из консоли Chrome я получил следующее:

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

Я много искал и нашел его, возможно, активы: премкомпиляция. Я изменил docker-compose.yml , run docker-compose run app rake db: assets:precompile, Даже я скопировал public/assets/* в контейнер, но не повезло.

Главный Компьютер: CentOS 7

Любая идея-это здорово. Заранее спасибо.

Docker-сочинять.yml

1 app:
2     build: .
3
4     env_file: .env.production
5
6     environment:
7         RAILS_ENV: $RAILS_ENV
8
9     links:
10         - db
11

14     expose:
15         - "3000"
16
17 db:
18     image: postgres:9.4.5
19
20     volumes:
21         - eshop-postgres:/var/lib/postgresql/data
22
23 web:
24     build: .
25
26     dockerfile: config/containers/Dockerfile-nginx
27
28     volumes:
29         - ./public:/var/www/eshop/public
30
31     links:
32         - app
33     ports:
34         - "80:80"

Dockerfile

      2 FROM ruby:2.3.3-slim
     12 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev postgresql-client libsqlite3-dev nodejs vim
     15 ENV RAILS_ROOT /var/www/myapp
     18 RUN mkdir -p $RAILS_ROOT/tmp/pids
     19
     21 WORKDIR $RAILS_ROOT
     22
     26 COPY Gemfile Gemfile
     27
     28 COPY Gemfile.lock Gemfile.lock
     29
     31 RUN gem install bundler
     32
     34 RUN bundle install
     35
     37 COPY . .
     38

     39 - RUN RAILS_ENV=production bundle exec rake assets:precompile --trace~
     40 - RUN bundle exec rake assets:precompile --trace~

     40 + RUN bundle exec rake RAILS_ENV=$RAILS_ENV DATABASE_URL=postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@127.0.0.1/$POSTGRES_PRODUCTION_DB assets:precompile
     41 + VOLUMES ["$RAILS_ROOT/public"]

     46 + CMD [ "config/containers/app_cmd.sh" ]

Config / container/Docker-nginx

      2 FROM nginx

     12 RUN apt-get update -qq && apt-get -y install apache2-utils vim

     15 ENV RAILS_ROOT /var/www/myapp

     18 WORKDIR $RAILS_ROOT

     21 RUN mkdir log

     25 COPY public public/

     28 COPY config/containers/nginx.conf /tmp/myapp.nginx

     32 RUN envsubst '$RAILS_ROOT' < /tmp/myappv.nginx > /etc/nginx/conf.d/default.conf

     35 CMD [ "nginx", "-g", "daemon off;" ]

Обновлено:

Я сделал некоторые обновления в соответствии с советами @bkunzi01. Но нет удача.

Dockerfile

 40 RUN bundle exec rake RAILS_ENV=$RAILS_ENV DATABASE_URL=postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@127.0.0.1/$POSTGRES_PRODUCTION_DB assets:precompile
 41 VOLUME ["$RAILS_ROOT/public"] 

 46 CMD [ "config/containers/app_cmd.sh" ]

.ОКР.производство

# *.env.production*    

RAILS_ENV=production
RAILS_ROOT=/var/www/eshop
SECRET_KEY_BASE=the_long_code
POSTGRES_PRODUCTION_DB=production_db
POSTGRES_USER=postgres
POSTGRES_PASSWORD=keep_secret_ps

Есть еще одно [предупреждение] в журнале docker-compose:

web_1  | 2017/03/02 05:45:14 [warn] 1#1: server name "/var/www/eshop/public" has suspicious symbols in /etc/nginx/conf.d/default.conf:16
web_1  | nginx: [warn] server name "/var/www/eshop/public" has suspicious symbols in /etc/nginx/conf.d/default.conf:16
3 3

3 ответа:

У большинства людей эта ошибка возникает из-за отсутствия узла.js однако у вас есть это, поэтому я думаю, что следующий вероятный кандидат должен добавить директиву volume, а также рассмотреть возможность изменения вашей команды предварительной компиляции в строке 39 dockerfile на:

RUN bundle exec rake RAILS_ENV=production DATABASE_URL=postgresql://user:pass@127.0.0.1/dbname SECRET_TOKEN=makeupasecret assets:precompile

VOLUME ["$RAILS_ROOT/public"]

Добавление этой директивы volume здесь откроет ваши активы для nginx, сохранив предварительно скомпилированные активы в томе.

Кроме того, вы можете сделать все, что хотите для secret_token и информации о базе данных. Причина в том, что рельсы будут выходите из себя, когда секретный маркер и пользователь не предоставляются, но вы можете полностью их выдумать, потому что Rails не проверяет их здесь lol...

Кроме того, не забудьте удалить вторую команду precompile:assets, так как она не нужна.

Примечание: Я бы также добавил в конце файла Dockerfile строку для запуска запуска unicorn или любого другого сервера приложений, на котором вы собираетесь запускать rails за nginx.

Исх. CMD bundle exec unicorn -c config/unicorn.rb

У меня была точно такая же проблема. Оказывается, настоящая причина заключалась в том, что config.public_file_server.enabled не был установлен в моем config/environments/production.rb.

Чтобы решить эту проблему, я просто добавил переменную окружения в свой docker-compose.yml:

version: '2'
services:
  app:
    ...
    environment:
      - RAILS_SERVE_STATIC_FILES=true

Я использую Rails 5.0.1.

Надеюсь, это поможет.

Я наткнулся на этот пост, поскольку у меня была та же проблема. С тех пор я в значительной степени решил ее, разобрав свой контейнер. Я проконсультировался с Докером docs для Rails: https://docs.docker.com/compose/rails/ и настроил мои Dockerfile и docker-compose.файл yml соответственно.

Я пошел вперед и забрал nginx на данный момент, так как я Докер n00b и просто хочу, чтобы моя вещь работала в первую очередь.

Вот мой Dockerfile

# Base image:
FROM ruby:2.3.1

# Install dependencies
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev postgresql-client nodejs

# Set an environment variable where the Rails app is installed to inside of Docker image:
ENV RAILS_ROOT /Users/jessecalton/WatchNext
RUN mkdir -p $RAILS_ROOT/tmp/pids

# Set working directory, where the commands will be ran:
WORKDIR $RAILS_ROOT



# Gems:
ADD Gemfile* $RAILS_ROOT

RUN gem install bundler
RUN bundle install

# Copy the main application.
COPY . $RAILS_ROOT

И мой docker-сочинять.yml

version: '3'
services:
  # service configuration for our dockerized Rails app
  app:
    # use the Dockerfile next to this file
    build: .



    # sources environment variable configuration for our app
    env_file: .env

    # rely on the RAILS_ENV value of the host machine
    environment:
      RAILS_ENV: $RAILS_ENV


    # makes the app container aware of the DB container
    links:
      - db

    # expose the port we configured Unicorn to bind to
    expose:
      - "3000"

  # service configuration for our database
  db:

    # use the preferred version of the official Postgres image
    # see https://hub.docker.com/_/postgres/
    image: postgres:latest

  # service configuration for our web server
  web:

    # set the build context to the root of the Rails app
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'

    volumes:
      - /Users/jessecalton/WatchNext/

    # makes the web container aware of the app container
    links:
      - app

    # expose the port we configured Nginx to bind to
    ports:
      - "3000:3000"
    depends_on:
      - db

Я следовал другим инструкциям конфигурации из https://docs.docker.com/compose/rails / сайт, и после создания и переноса моей базы данных, получил все, чтобы работать.

Полное раскрытие: мне все еще нужно найти способ закрыть и повторно открыть сервер Puma, не отбрасывая контейнер и, таким образом, не отбрасывая базу данных. Другими словами, если вы нажмете Ctrl+C, чтобы закрыть сервер, а затем снова сделаете docker-compose up, Puma все равно будет запуск в фоновом режиме, и ваше приложение выйдет, ссылаясь на " сервер уже запущен."

Просто хотел передать эту информацию, поскольку ваша же самая проблема доставляла мне проблемы весь день.