2015-02-26 1 views
2

Я использую рис и пытаюсь использовать контейнер тома данных для обмена загруженными файлами между веб-сервером Rails и работником Resque, работающим в другом контейнере. Для этого контейнер объема данных определяет том /rails/public/system, который предназначен для совместного использования этих файлов. Процессы Rails и Resque выполняются как пользователь rails в своих соответствующих контейнерах, которые оба основаны на изображении markb/litdistco. Все вместе fig.yml выглядит следующим образом:Как смонтировать том из контейнера данных при сохранении владельца и разрешений?

redis: 
    image: redis:2.8.17 
    volumes_from: 
    - file 
web: 
    image: markb/litdistco 
    command: /usr/bin/start-server /opt/nginx/sbin/nginx 
    ports: 
    - 80:8000 
    - 443:4430 
    environment: 
    DATABASE_URL: 
    links: 
    - redis 
    volumes_from: 
    - file 
worker: 
    image: markb/litdistco 
    command: /usr/bin/start-server "bundle exec rake environment resque:work QUEUE=litdistco_offline RAILS_ENV=production" 
    environment: 
    DATABASE_URL: 
    links: 
    - redis 
    volumes_from: 
    - file 
file: 
    image: markb/litdistco 
    command: echo "datastore" 
    volumes: 
    - /var/redis 
    - /rails/log 
    - ./config/container/ssl:/etc/ssl 

Когда web и worker контейнеры работают, я могу увидеть каталог /rails/public/system в обоих, однако она принадлежит root пользователя в обоих контейнерах и разрешений на каталог запрещает пользователю rails писать в этот каталог.

Для справки есть два докер-фильтра, которые входят в комплект контейнера markb/litdistco. Первые определяет базовое изображение я использую для местного развития (Dockerfile):

# This Dockerfile is based on the excellent blog post by SteveLTN: 
# 
# http://steveltn.me/blog/2014/03/15/deploy-rails-applications-using-docker/ 
# 
# KNOWN ISSUES: 
# 
# * Upgrading passenger or ruby breaks nginx directives with absolute paths 

# Start from Ubuntu base image 
FROM ubuntu:14.04 

MAINTAINER Mark Bennett <[email protected]> 

# Update package sources 
RUN apt-get -y update 

# Install basic packages 
RUN apt-get -y install build-essential libssl-dev curl 

# Install basics 
RUN apt-get -y install tmux vim 
RUN apt-get install -y libcurl4-gnutls-dev 

# Install libxml2 for nokogiri 
RUN apt-get install -y libxslt-dev libxml2-dev 

# Install mysql-client 
RUN apt-get -y install mysql-client libmysqlclient-dev 

# Add RVM key and install requirements 
RUN command curl -sSL https://rvm.io/mpapis.asc | gpg --import - 
RUN curl -sSL https://get.rvm.io | bash -s stable 
RUN /bin/bash -l -c "rvm requirements" 

# Create rails user which will run the app 
RUN useradd rails --home /rails --groups rvm 

# Create the rails users home and give them permissions 
RUN mkdir /rails 
RUN chown rails /rails 

RUN mkdir -p /rails/public/system 
RUN chown rails /rails/public/system 
# Add configuration files in repository to filesystem 
ADD config/container/start-server.sh /usr/bin/start-server 
RUN chown rails /usr/bin/start-server 
RUN chmod +x /usr/bin/start-server 

# Make a directory to contain nginx and give rails user permission 
RUN mkdir /opt/nginx 
RUN chown rails /opt/nginx 

# Switch to rails user that will run app 
USER rails 

# Install rvm, ruby, bundler 
WORKDIR /rails 
ADD ./.ruby-version /rails/.ruby-version 
RUN echo "gem: --no-ri --no-rdoc" > /rails/.gemrc 
RUN /bin/bash -l -c "rvm install `cat .ruby-version`" 
RUN /bin/bash -l -c "gem install bundler --no-ri --no-rdoc" 

# Install nginx 
RUN /bin/bash -l -c "gem install passenger --no-ri --no-rdoc" 
RUN /bin/bash -l -c "passenger-install-nginx-module" 
ADD config/container/nginx-sites.conf.TEMPLATE /opt/nginx/conf/nginx.conf.TEMPLATE 
ADD config/container/set-nginx-paths.sh /rails/set-nginx-paths.sh 
RUN /bin/bash -l -c "source /rails/set-nginx-paths.sh" 

# Copy the Gemfile and Gemfile.lock into the image. 
# Temporarily set the working directory to where they are. 
WORKDIR /tmp 
ADD Gemfile Gemfile 
ADD Gemfile.lock Gemfile.lock 

# bundle install 
RUN /bin/bash -l -c "bundle install" 

# Add rails project to project directory 
ADD ./ /rails 

# set WORKDIR 
WORKDIR /rails 

# Make sure rails has the right owner 
USER root 
RUN chown -R rails:rails /rails 

# Publish ports 
EXPOSE 3000 
EXPOSE 4430 
EXPOSE 8000 

Это помечено как litdistco-base изображений, а затем я использую config/containers/production/Dockerfile для формирования изображения, что я помечать, как markb/litdistco и запустить в постановке и производстве.

# Start from LitDistCo base image 
FROM litdistco-base 

MAINTAINER Mark Bennett <[email protected]> 

USER rails 

# Setup volumes used in production 
VOLUME ["/rails/log", "/rails/public/system"] 

# Build the application assets 
WORKDIR /rails 
RUN /bin/bash -l -c "touch /rails/log/production.log; chmod 0666 /rails/log/production.log" 
RUN /bin/bash -l -c "source /etc/profile.d/rvm.sh; bundle exec rake assets:precompile" 

Может кто-нибудь, возможно, объяснить, как я могу получить объем контейнера данных для монтирования в записываемый на rails пользователем. Я очень хотел бы избежать запуска любого из процессов Ruby как root, даже внутри контейнера.

В каком-то контексте я должен также упомянуть, что я разрабатываю изображения в Docker в boot2docker в Mac OS X, а затем запускаю их в экземпляре Google Compute Engine на хосте Ubuntu 14.04. Благодаря!

+0

У меня тоже была проблема с томами постгеров. – Greg

ответ

2

Я бы немного изменил ваше изображение. Напишите сценарий оболочки, который обертывает команду/usr/bin/start-server на вашем fig.yml и помещает ее внутри вашего контейнера.

Затем вы можете резать все, что вам нужно, до запуска вашего сервера.

Запуск контейнера с рельсами пользователя по умолчанию также не нужен, если вы запускаете сервер в качестве пользователя рельсов: sudo -u rails/usr/bin/start-server (или что-то в этом роде).

Лично еще не использовал изображение на основе litdistco, поэтому не знаю всей специфики его работы.

+0

Это не совсем тот ответ, который я бы хотел, так как я хотел бы избежать позволить контейнеру получить доступ к пользователю root, но это, безусловно, решит мою проблему и заставит приложение работать исправно, не требуя от меня переноса моего веб-сервера и рабочего в тот же контейнер. –

Смежные вопросы