Ruby on rails 如何在保留所有者和权限的同时从数据容器装载卷?

Ruby on rails 如何在保留所有者和权限的同时从数据容器装载卷?,ruby-on-rails,ruby,docker,dockerfile,fig,Ruby On Rails,Ruby,Docker,Dockerfile,Fig,我正在使用Fig并尝试使用数据卷容器在Rails web服务器和在另一个容器中运行的Resque worker之间共享上载的文件。为此,数据卷容器定义了一个/rails/public/system卷,用于共享这些文件。Rails和Resque进程作为Rails用户运行在各自的容器中,这两个容器都基于markb/litdistco图像。总之,fig.yml看起来是这样的: redis: image: redis:2.8.17 volumes_from: - file web:

我正在使用Fig并尝试使用数据卷容器在Rails web服务器和在另一个容器中运行的Resque worker之间共享上载的文件。为此,数据卷容器定义了一个
/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
):

有人能解释一下我如何让
rails
用户将数据容器卷装载为可写的吗。我非常希望避免以root身份运行任何Ruby进程,即使是在容器中


在某些情况下,我还应该提到,我正在Mac OS X上boot2docker中的Docker中开发图像,然后在Ubuntu 14.04主机上的Google计算引擎实例上运行它们。谢谢

我会稍微修改一下你的图像。编写一个shell脚本,将/usr/bin/start server命令包装在fig.yml中,并将其放入容器中

然后,在启动服务器之前,您可以使用ChownRails来完成任何需要的操作

使用默认用户rails运行容器也不是真正需要的,只要您以rails用户的身份启动服务器:sudo-u rails/usr/bin/start server(或类似的名称)


个人尚未使用litdistco base映像,因此不知道其工作原理的所有细节。

我认为您需要以以下方式修改
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"
#从LitDistCo基础图像开始
来自litdistco基地
维修员马克·贝内特
运行mkdir-p/rails/log
运行mkdir-p/rails/public/system
运行chown-rrails:rails/rails/log/rails/public/system
用户轨道
#设置生产中使用的卷
卷[“/rails/log”,“/rails/public/system”]
#构建应用程序资产
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资产:预编译”

我在postgres卷上也遇到了这个问题。这不是我想要的答案,因为我想避免容器访问根用户,但这肯定会解决我的问题,让应用程序正常工作,而不需要我将web服务器和工作程序移动到同一个容器中。
# 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"
# 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"