Currently I'm setting up my app using docker. I've got a minimal rails app, with 1 controller. You can get my setup by running these:
目前我正在使用docker设置我的应用。我有一个最小的rails应用程序,有1个控制器。你可以运行以下命令来获取我的设置:
rails new app --database=sqlite --skip-bundle
cd app
rails generate controller --skip-routes Home index
echo "Rails.application.routes.draw { root 'home#index' }" > config/routes.rb
echo "gem 'foreman'" >> Gemfile
echo "web: rails server -b 0.0.0.0" > Procfile
echo "port: 3000" > .foreman
And I have the following setup:
我有以下设置:
Dockerfile
:
FROM ruby:2.3
# Install dependencies
RUN apt-get update && apt-get install -y \
nodejs \
sqlite3 \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
# Configure bundle
RUN bundle config --global frozen 1
RUN bundle config --global jobs 7
# Expose ports and set entrypoint and command
EXPOSE 3000
CMD ["foreman", "start"]
# Install Gemfile in different folder to allow caching
WORKDIR /tmp
COPY ["Gemfile", "Gemfile.lock", "/tmp/"]
RUN bundle install --deployment
# Set environment
ENV RAILS_ENV production
ENV RACK_ENV production
# Add files
ENV APP_DIR /app
RUN mkdir -p $APP_DIR
COPY . $APP_DIR
WORKDIR $APP_DIR
# Compile assets
RUN rails assets:precompile
VOLUME "$APP_DIR/public"
Where VOLUME "$APP_DIR/public"
is creating a volume that's shared with the Nginx container, which has this in the Dockerfile
:
VOLUME“$ APP_DIR / public”正在创建一个与Nginx容器共享的卷,它在Dockerfile中有这个:
FROM nginx
ADD nginx.conf /etc/nginx/nginx.conf
And then docker-compose.yml
:
然后是docker-compose.yml:
version: '2'
services:
web:
build: config/docker/web
volumes_from:
- app
links:
- app:app
ports:
- 80:80
- 443:443
app:
build: .
environment:
SECRET_KEY_BASE: 'af3...ef0'
ports:
- 3000:3000
This works, but only the first time I build it. If I change any assets, and build the images again, they're not updated. Possibly because volumes are not updated on image build, I think because how Docker handles caching.
这有效,但只是我第一次构建它。如果我更改任何资产,并再次构建图像,它们就不会更新。可能因为图像构建时没有更新卷,我想是因为Docker如何处理缓存。
I want the assets to be updated every time I run docker-compose built && docker-compose up
. Any idea how to accomplish this?
我希望每次运行docker-compose built && docker-compose时都会更新资产。知道怎么做到这一点?
1 个解决方案
#1
2
Compose preserves volumes on recreate.
Compose在重新创建时保留卷。
You have a couple options:
你有几个选择:
- don't use volumes for the assets, instead build the assets and
ADD
orCOPY
them into the web container during build -
docker-compose rm app
before runningup
to remove the old container and volumes.
不要为资产使用卷,而是在构建期间构建资产并将其添加或复制到Web容器中
docker-compose rm应用程序在运行之前删除旧容器和卷。
#1
2
Compose preserves volumes on recreate.
Compose在重新创建时保留卷。
You have a couple options:
你有几个选择:
- don't use volumes for the assets, instead build the assets and
ADD
orCOPY
them into the web container during build -
docker-compose rm app
before runningup
to remove the old container and volumes.
不要为资产使用卷,而是在构建期间构建资产并将其添加或复制到Web容器中
docker-compose rm应用程序在运行之前删除旧容器和卷。