Docker容器中的卷权限错误

9

我在本地使用docker-machine虚拟机,运行的是Docker 1.8.1版本,操作系统是OSX 10.11。

以下是我的docker-compose.yml文件内容:

web:
    build: docker/web
    ports:
        - 80:80
        - 8080:8080
    volumes:
        - $PWD/cms:/srv/cms

我的Dockerfile看起来像这样:
FROM alpine

# install nginx and php
RUN apk add --update \
    nginx \
    php \
    php-fpm \
    php-pdo \
    php-json \
    php-openssl \
    php-mysql \
    php-pdo_mysql \
    php-mcrypt \
    php-ctype \
    php-zlib \
    supervisor \
    wget \
    curl \
    && rm -rf /var/cache/apk/*

RUN mkdir -p /etc/nginx && \
    mkdir -p /etc/nginx/sites-enabled && \
    mkdir -p /var/run/php-fpm && \
    mkdir -p /var/log/supervisor && \
    mkdir -p /srv/cms

RUN rm /etc/nginx/nginx.conf
ADD nginx.conf /etc/nginx/nginx.conf
ADD thunder.conf /etc/nginx/sites-enabled/thunder.conf

ADD nginx-supervisor.ini /etc/supervisor.d/nginx-supervisor.ini

WORKDIR "/srv/cms"
VOLUME "/srv/cms"

EXPOSE 80
EXPOSE 8080
EXPOSE 22

CMD ["/usr/bin/supervisord"]

当我用 docker-compose up 运行一切正常,我的卷被挂载到正确的位置。
但是挂载文件夹 /srv/cms 中的权限似乎不对。容器中的用户为“1000”,组为“50”。Web 服务器无法在此文件夹中创建任何文件,因为它以用户“root”运行。

如果它以“root”运行,则应能够写入任何文件夹。您的主管配置是否指定了不同的用户?在您的OS X上,“uid 1000”和“gid 50”是该用户吗? - Xiongbing Jin
3个回答

8
总体思路: Docker不是Vagrant,将两个不同的服务放入一个容器中是错误的!将其拆分为两个不同的镜像,并将它们链接在一起。不要使用这样的垃圾镜像。
请查看并遵循https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/
  • 避免安装不必要的软件包
  • 每个容器只运行一个进程
  • 最小化层数
如果您这样做:
  • 您将删除您的主管
  • 您可以减少层数
应该像这样(示例):
FROM alpine

RUN apk add --update \
    wget \
    curl
RUN apk add --update \
    php \
    php-fpm \
    php-pdo \
    php-json \
    php-openssl \
    php-mysql \
    php-pdo_mysql \
    php-mcrypt \
    php-ctype \
    php-zlib
RUN usermod -u 1000 www-data
RUN rm -rf /var/cache/apk/*

EXPOSE 9000

对于nginx,使用默认镜像并挂载配置即可。

docker-compose文件如下:

nginx:
  image: nginx
  container_name: site.dev
  volumes:
    - ./myconf1.conf:/etc/nginx/conf.d/myconf1.conf
    - ./myconf2.conf:/etc/nginx/conf.d/myconf2.conf
    - $PWD/cms:/srv/cms
  ports:
    - "80:80"
  links:
   - phpfpm
phpfpm:
  build: ./phpfpm/
  container_name: phpfpm.dev
  command: php5-fpm -F --allow-to-run-as-root
  volumes:
    - $PWD/cms:/srv/cms

2) 在php容器的Dockerfile中添加RUN usermod -u 1000 www-data,这将修复权限问题。


5
Alpine默认不支持usermod命令。您需要从“testing”分支安装shadow软件包。 - Jeff Kilbride
在飞机水上迫降时,不要在机内充气救生衣。为什么呢?如果你不解释原因,人们仍然会充气救生衣。同样,“将多个服务放入一个容器中是错误的”也是如此。因此,你应该解释清楚。用户修改也是一样。 - Toskan

7

对于alpine版本,您需要使用:

RUN apk add shadow && usermod -u 1000 www-data && groupmod -g 1000 www-data

0

主机授予UID = 1000和GID = 1000的权限,但在Docker镜像中它们不是有效的用户或组。

在镜像中执行这些命令将向这些ID分配www-data;

usermod -u 1000 www-data

groupmod -g 1000 www-data

我能够在 Docker Desktop、PHP-FPM 和终端中运行它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接