Rails 使用 docker-compose 部署,资产不工作
Rails deploying with docker-compose, assets doesn't working
这是我关注的一篇非常有用的文章:
Docker for an Existing Rails Application
我被困在这个问题上了。应用可以运行没有报错,在网上冲浪可以看到索引页。但是索引页面看起来有线,看起来 scss 不起作用并且图像没有出现。
从 Chrome 控制台,我得到了这个:
我做了很多搜索,发现它可能是 assets:premcompile。我更改了 docker-compose.yml , 运行 docker-compose run app rake db: assets:precompile
,甚至我将 public/assets/*
复制到容器中,但是运气不好。
主机:CentOS 7
任何想法都是好的。提前致谢。
docker-compose.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"
Docker 文件
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 的建议做了一些更新。但是运气不好。
Docker 文件
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
# *.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
大多数人都有这个错误,因为他们缺少 node.js 但是你有这个,所以我认为下一个可能的候选者是添加一个 volume 指令,并考虑在 dockerfile 的第 39 行更改你的预编译命令至:
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 会吓坏,但你完全可以弥补它们,因为 Rails 不会在这里检查它们 lol...
此外,请务必删除第二个 precompile:assets 命令,因为它不需要。
注意:我还会在 Dockerfile 的末尾添加一行以触发 运行ning unicorn 或您要在后面 运行 rails 的任何其他应用程序服务器nginx.
例如。 CMD bundle exec unicorn -c config/unicorn.rb
我遇到了完全相同的问题。原来真正的原因是我的config/environments/production.rb
.
没有设置config.public_file_server.enabled
为了解决这个问题,我只是在 docker-compose.yml
:
中添加了一个环境变量
version: '2'
services:
app:
...
environment:
- RAILS_SERVE_STATIC_FILES=true
我正在使用 Rails 5.0.1.
希望对您有所帮助。
我遇到了这个 post 因为我遇到了同样的问题。从那以后,我通过剥离我的容器几乎解决了这个问题。我查阅了 Rails 的 Docker 文档:https://docs.docker.com/compose/rails/ 并相应地调整了我的 Docker 文件和 docker-compose.yml 文件。
我暂时放弃了 nginx,因为我是 Docker n00b 并且只想让我的东西先工作。
这是我的Docker文件
# 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-compose.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 仍将在后台 运行,您的应用程序将退出,引用 "a server is already running."
只是想传递此信息,因为您同样的问题整天困扰着我。
这是我关注的一篇非常有用的文章:
Docker for an Existing Rails Application
我被困在这个问题上了。应用可以运行没有报错,在网上冲浪可以看到索引页。但是索引页面看起来有线,看起来 scss 不起作用并且图像没有出现。
从 Chrome 控制台,我得到了这个:
我做了很多搜索,发现它可能是 assets:premcompile。我更改了 docker-compose.yml , 运行 docker-compose run app rake db: assets:precompile
,甚至我将 public/assets/*
复制到容器中,但是运气不好。
主机:CentOS 7
任何想法都是好的。提前致谢。
docker-compose.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"
Docker 文件
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 的建议做了一些更新。但是运气不好。
Docker 文件
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
# *.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
大多数人都有这个错误,因为他们缺少 node.js 但是你有这个,所以我认为下一个可能的候选者是添加一个 volume 指令,并考虑在 dockerfile 的第 39 行更改你的预编译命令至:
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 会吓坏,但你完全可以弥补它们,因为 Rails 不会在这里检查它们 lol...
此外,请务必删除第二个 precompile:assets 命令,因为它不需要。
注意:我还会在 Dockerfile 的末尾添加一行以触发 运行ning unicorn 或您要在后面 运行 rails 的任何其他应用程序服务器nginx.
例如。 CMD bundle exec unicorn -c config/unicorn.rb
我遇到了完全相同的问题。原来真正的原因是我的config/environments/production.rb
.
config.public_file_server.enabled
为了解决这个问题,我只是在 docker-compose.yml
:
version: '2'
services:
app:
...
environment:
- RAILS_SERVE_STATIC_FILES=true
我正在使用 Rails 5.0.1.
希望对您有所帮助。
我遇到了这个 post 因为我遇到了同样的问题。从那以后,我通过剥离我的容器几乎解决了这个问题。我查阅了 Rails 的 Docker 文档:https://docs.docker.com/compose/rails/ 并相应地调整了我的 Docker 文件和 docker-compose.yml 文件。
我暂时放弃了 nginx,因为我是 Docker n00b 并且只想让我的东西先工作。
这是我的Docker文件
# 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-compose.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 仍将在后台 运行,您的应用程序将退出,引用 "a server is already running."
只是想传递此信息,因为您同样的问题整天困扰着我。