2016-03-23 14 views
8

Hiện tại tôi đang thiết lập ứng dụng của mình bằng trình cắm. Tôi đã có một ứng dụng đường ray tối thiểu, với 1 bộ điều khiển. Bạn có thể nhận cài đặt của tôi bằng cách chạy này:Cung cấp các tài sản biên dịch sẵn của Rails bằng nginx trong Docker

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 

Và tôi có các thiết lập sau:

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" 

đâu VOLUME "$APP_DIR/public" đang tạo ra một khối lượng đó là chia sẻ với container Nginx, mà có số này trong số Dockerfile:

FROM nginx 

ADD nginx.conf /etc/nginx/nginx.conf 

Và sau đó 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 

Tác phẩm này, nhưng chỉ lần đầu tiên tôi tạo. Nếu tôi thay đổi bất kỳ nội dung nào và tạo lại hình ảnh, chúng sẽ không được cập nhật. Có thể bởi vì khối lượng không được cập nhật về xây dựng hình ảnh, tôi nghĩ bởi vì Docker xử lý bộ nhớ đệm như thế nào.

Tôi muốn nội dung được cập nhật mỗi khi tôi chạy docker-compose built && docker-compose up. Bất kỳ ý tưởng làm thế nào để thực hiện điều này?

Trả lời

2

Compose preserves volumes on recreate.

Bạn có một vài lựa chọn:

  1. không sử dụng khối lượng cho các tài sản, thay vì xây dựng tài sản và ADD hoặc COPY chúng vào những trang web chứa trong xây dựng
  2. docker-compose rm app trước khi chạy up để loại bỏ các container và khối lượng cũ.
+1

Cảm ơn, bất kỳ ý tưởng nào về cách thức này sẽ hoạt động trên việc triển khai với, Kubernetes? – jeroenvisser101

Các vấn đề liên quan