关于linux:泊坞窗挂载卷,权限被拒绝

docker mounting volume with permission denied

我正在尝试设置一个从主机挂载卷的Docker容器。无论我尝试什么,当我远程进入Docker容器时,总会说权限被拒绝。这是我尝试添加到Docker文件中的一些命令:

1
RUN su -c"setenforce 0"

1
chcon -Rt svirt_sandbox_file_t /app

当我远程进入容器时仍然出现以下错误:

Error: EACCES: permission denied, scandir '/app'
at Error (native)

Error: EACCES: permission denied, open 'npm-debug.log.578996924'
at Error (native)

正如您所看到的,应用程序目录已分配给具有uid 1000的某个用户:

enter

这是我的docker文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
FROM php:5.6-fpm

# Install modules
RUN apt-get update && apt-get install -y \\
    git \\
    unzip \\
    libmcrypt-dev  \\
    libicu-dev \\
    mysql-client \\
    freetds-dev \\
    libxml2-dev

RUN apt-get install -y freetds-dev php5-sybase

# This symlink fixes the pdo_dblib install
RUN ln -s /usr/lib/x86_64-linux-gnu/libsybdb.a /usr/lib/

RUN    docker-php-ext-install pdo \\
    && docker-php-ext-install pdo_mysql \\
    && docker-php-ext-install pdo_dblib \\
    && docker-php-ext-install iconv \\
    && docker-php-ext-install mcrypt \\
    && docker-php-ext-install intl \\
    && docker-php-ext-install opcache \\
    && docker-php-ext-install mbstring

# Override the default php.ini with a custom one
COPY ./php.ini /usr/local/etc/php/

# replace shell with bash so we can source files
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

# nvm environment variables
ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION 4.4.7

# install nvm
RUN curl --silent -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.2/install.sh | bash

# install node and npm
RUN source $NVM_DIR/nvm.sh \\
    && nvm install $NODE_VERSION \\
    && nvm alias default $NODE_VERSION \\
    && nvm use default

# add node and npm to path so the commands are available
ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH

# confirm installation
RUN node -v
RUN npm -v

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer --version

# Configure freetds
ADD ./freetds.conf /etc/freetds/freetds.conf

WORKDIR /app

# Gulp install
RUN npm install -g gulp
RUN npm install -g bower


CMD ["php-fpm"]

这是我的docker-compose:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
nginx_dev:
  container_name: nginx_dev
  build: docker/nginx_dev
  ports:
    -"80:80"
  depends_on:
    - php_dev
  links:
    - php_dev
  volumes:
    - ./:/app


php_dev:
  container_name: php_dev
  build: docker/php-dev
  volumes:
    - ./:/app`

是否可以运行任何命令来授予root用户访问应用程序目录的权限?我也在使用docker-compose。


从目录列表中,您似乎已经配置了selinux(这是权限位上的尾随点)。在启用了selinux的Docker中,您需要使用额外的标志:z挂载卷。 Docker将此描述为卷标签,但我相信这是selinux术语,而不是卷上的docker标签。

您生成的docker-compose.yml应该如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '2'

services:
   nginx_dev:
      container_name: nginx_dev
      build: docker/nginx_dev
      ports:
        -"80:80"
      depends_on:
        - php_dev
      links:
        - php_dev
      volumes:
        - ./:/app:z


   php_dev:
      container_name: php_dev
      build: docker/php-dev
      volumes:
        - ./:/app:z

注意,我也将语法更新为版本2。docker-compose.yml的版本1正在逐步淘汰。默认情况下,版本2将导致容器在其自己的网络中运行,通常这是首选方法,但是如果您有其他容器尝试与之通信,则可能会导致问题。