Docker 容器中卷的错误权限
Wrong permissions in volume in Docker container
I 运行 Docker 1.8.1 in OSX 10.11 通过本地 docker-machine VM.
我有以下 docker-compose.yml:
web:
build: docker/web
ports:
- 80:80
- 8080:8080
volumes:
- $PWD/cms:/srv/cms
我的 Docker 文件如下所示:
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"。
1) 总体思路:Docker它不是Vagrant。将两种不同的服务放在一个容器中是错误的!将其拆分为两个不同的图像并将它们 link 放在一起。别拍这种垃圾图了。
查看并关注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-撰写文件如:
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
添加到 Docker 容器的 php 文件中,它将解决权限问题。
对于高山版本你需要使用:
RUN apk add shadow && usermod -u 1000 www-data && groupmod -g 1000 www-data
I 运行 Docker 1.8.1 in OSX 10.11 通过本地 docker-machine VM.
我有以下 docker-compose.yml:
web:
build: docker/web
ports:
- 80:80
- 8080:8080
volumes:
- $PWD/cms:/srv/cms
我的 Docker 文件如下所示:
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"。
1) 总体思路:Docker它不是Vagrant。将两种不同的服务放在一个容器中是错误的!将其拆分为两个不同的图像并将它们 link 放在一起。别拍这种垃圾图了。
查看并关注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-撰写文件如:
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
添加到 Docker 容器的 php 文件中,它将解决权限问题。
对于高山版本你需要使用:
RUN apk add shadow && usermod -u 1000 www-data && groupmod -g 1000 www-data