【问题标题】:Wrong permissions in volume in Docker containerDocker容器中的卷权限错误
【发布时间】:2016-03-20 22:58:48
【问题描述】:

我通过本地 docker-machine VM 在 OSX 10.11 中运行 Docker 1.8.1。

我有以下 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”。网络服务器无法在此文件夹中创建任何文件,因为它以用户“root”运行。

【问题讨论】:

  • 如果它以root 运行,那么它应该能够写入任何文件夹。您的主管配置是否指定了不同的用户? uid 1000gid 50 是您 OS X 上的用户吗?

标签: macos docker docker-compose docker-machine


【解决方案1】:

1) 总体思路: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) 将RUN usermod -u 1000 www-data添加到php容器的Dockerfile中,它将解决权限问题。

【讨论】:

  • Alpine 不支持开箱即用的usermod。您需要从testing 分支安装shadow 包。
【解决方案2】:

对于高山版本,您需要使用:

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

【讨论】:

    猜你喜欢
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2020-01-07
    • 2019-12-26
    • 2019-05-30
    相关资源
    最近更新 更多