Docker容器中卷的权限错误

ttcibm8c  于 2023-03-22  发布在  Docker
关注(0)|答案(3)|浏览(170)

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

vwoqyblh

vwoqyblh1#

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,使用默认镜像和挂载configs. 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中,它将修复权限问题。

bgibtngc

bgibtngc2#

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

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

au9on6nz3#

主机将权限授予UID = 1000和GID = 1000,但它们不是Docker镜像中的有效用户或组。
在映像中执行的这些命令将为这些ID分配“www-data”;
usermod -u 1000 www数据
groupmod -g 1000 www-data
我可以从Docker Desktop、PHP-FPM、Terminal运行它们

相关问题