Phusion Passenger 和 Docker-Compose 权限问题

Phusion Passenger and Docker-Compose Issue with Permissions

我在 运行 docker-compose 和 Phusion Passenger 的 docker 图像时遇到权限问题。

具体来说,错误是: Permission denied @ rb_sysopen - /var/www/my_app/tmp/.....

我的 docker-compose.yml 文件包含以下信息:

happy_passenger:
  build: .
  container_name: happy_passenger
  ports:
    - "80:80"
  volumes:
    - .:/var/www/my_app
  links:
   - redis
redis:
  container_name: my_redis
  image: redis
  ports:
    - "6379:6379"

当 运行 docker-compose up 时,应用程序加载,但我遇到了 Permission denied @ rb_sysopen 错误。


我的Dockerfile也比较直接:

# Dockerfile

FROM phusion/passenger-ruby21:0.9.17
MAINTAINER meoww- "none@none.com"

# Set correct environment variables.
ENV HOME /root

# Initialize "in production"
ENV RAILS_ENV production

# Use baseimage-docker's init process.
CMD ["/sbin/my_init"]

# Turn on Nginx
RUN rm -f /etc/service/nginx/down

# Remove the default site that comes with Nginx
RUN rm /etc/nginx/sites-enabled/default

ADD nginx.conf /etc/nginx/sites-enabled/my_app.conf

WORKDIR /tmp
ADD Gemfile /tmp/
ADD Gemfile.lock /tmp/
RUN bundle install

ADD . /var/www/my_app
RUN chown -R app:app /var/www/my_app

# Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

疑难解答

  1. 当我修改我的 docker-compose.yml 文件并删除 volumes: 块时,我能够查看我的应用程序。不幸的是,如果我没有 volumes: 块,那么我需要在每次更改代码后重建 docker 图像。所以该选项将不起作用。

  2. 我注意到当应用程序启动时,我也看到了权限错误:

App 66 stderr: Rails Error: Unable to access log file. Please ensure that /var/www/my_app/log/development.log exists and is writable (ie, make it writable for user and group: chmod 0664 /var/www/my_app/log/development.log)

根据上面的错误 (#2),我尝试将 RUN chmod -R 0664 /var/www/my_app 添加到我的 Dockerfile 并删除 + 重建所有内容(例如 docker rmi [image],然后是 docker-compose up重建我的形象)。这似乎对这个问题没有任何影响。


在这一点上,我倾向于认为我设置 docker-compose 读写权限的方式有问题,但我没有找到任何明确的文档说明我需要什么改变。

如有任何建议,我们将不胜感激。

提前致谢。

问题似乎出在 boot2docker 及其在 OSX 上挂载卷的方式上。首先,我 运行 命令 docker inspect happy_passenger。这为我提供了有关我的卷的以下信息:

"Mounts": [
    {
        "Source": "/Users/meow/test/www/demodocker",
        "Destination": "/var/www/my_app",
        "Mode": "rw",
        "RW": true
    }
],

音量在 docker 中显示为 Read/Write (R/W) 已启用。在正常情况下,这表明我应该能够使用已安装的卷并写入文件系统。但是,由于 R/W 权限存在错误,由于权限错误,我遇到了各种错误。即使在共享目录和主机目录上 运行 chmod -R 777 . 也没有解决问题

为了解决这个问题,我做了以下工作:

在我的dockerfile

# Dockerfile

FROM phusion/passenger-ruby21:0.9.17
MAINTAINER meoww- "none@none.com"

# Hack to get around the boot2docker issue.
RUN usermod -u 1000 app
RUN usermod -G staff app

添加 RUN usermod -u 1000 appRUN usermod -G staff app 这两个命令后,我能够在使用 docker-compose up.

时成功加载我的容器化应用程序

希望这有助于修复他们的 docker 权限 errors/docker 挂载卷错误。

另外,link Github 中的问题:

https://github.com/boot2docker/boot2docker/issues/581