Развертывание 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 ответа:
У большинства людей эта ошибка возникает из-за отсутствия узла.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 все равно будет запуск в фоновом режиме, и ваше приложение выйдет, ссылаясь на " сервер уже запущен."Просто хотел передать эту информацию, поскольку ваша же самая проблема доставляла мне проблемы весь день.