Я использую Fig и пытаюсь использовать контейнер тома данных для обмена загруженными файлами между веб-сервером 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 писать в этот каталог.

Для справки есть два Dockerfile, которые используются для создания контейнера 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 <mark@burmis.ca>

# 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 <mark@burmis.ca>

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. Спасибо!

2
Mark B 26 Фев 2015 в 07:47

2 ответа

Лучший ответ

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

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

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

Лично еще не использовал образ litdistco-base, поэтому не знаю всех особенностей того, как он работает.

2
aholt 26 Фев 2015 в 19:28

Я думаю, вам нужно изменить изображение litdistco-base следующим образом, чтобы оба каталога принадлежали rails:

# Start from LitDistCo base image
FROM litdistco-base

MAINTAINER Mark Bennett <mark@burmis.ca>

RUN mkdir -p /rails/log
RUN mkdir -p /rails/public/system
RUN chown -R rails:rails /rails/log /rails/public/system

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"
-1
Pere Joan Martorell 29 Окт 2020 в 10:47