使用docker-compose为主机目录添加权限

9

我正在尝试使用docker-compose设置开发环境,但我的容器似乎没有权限访问挂载到容器中的主机目录。当运行一个尝试修改卷内文件夹的grunt任务时,我遇到了以下错误:

app_1                   | Warning: Unable to delete ".tmp" file (EACCES, permission denied '.tmp'). Use --force to continue.

这是我的Docker文件:

FROM node:0.10

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

RUN apt-get update \
    && apt-get install -y --no-install-recommends ruby-sass \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean -y \
    && apt-get autoremove -y

RUN npm install -g grunt-cli bower

RUN groupadd -r node \
&&  useradd -r -m -g node node

RUN chown -R node:node /usr/src/app

USER node

EXPOSE 8080

我的docker-compose文件如下:

app:
  build: .
  dockerfile: Dockerfile.dev
  ports:
   - "9000:9000"
  env_file:
   - ./server/config/env/development.env
  volumes:
   - ./:/usr/src/app:Z
  command: bash -c "npm install && bower install && grunt dev && npm start"

db:
  ports:
   - "27017:27017"
  • 我正在运行Ubuntu 15.10,使用的是docker-compose版本1.5.2,构建版本为7240ff3
  • 请注意,我正在使用:Z权限

你设置了权限,但是你又在其上挂载了一个卷,这个卷将会有不同的权限。 - Adrian Mouat
但看起来权限与节点和根有关 - 如果删除USER节点行,它是否有效? - Adrian Mouat
1
@AdrianMouat - 我尝试移除mkdir命令,虽然我同意它是多余的,但据我所见,这不是破坏权限的原因,我收到了相同的错误。 编辑后的Dockerfile的gist:https://gist.github.com/avif/a7a99b14a6abca6157e6我尝试移除与node用户相关的行,它确实奏效了(!),尽管现在应用程序正在使用root用户,这与我的生产环境有所不同 - 这也是一开始使用docker的主要原因... 编辑后的Dockerfile的gist:https://gist.github.com/avif/c26d7a389aad11e8e69d但是还是谢谢,至少现在问题被隔离到了node用户那里。 - Avi Farada
我从来没有提到过mkdir这一行。我会添加一个答案,如果有帮助的话,请告诉我。 - Adrian Mouat
1个回答

4

这只是一个文件权限问题。

首先要意识到的是,您挂载的卷具有与您在Dockerfile中创建和chown的文件夹不同的权限。节点用户可能没有访问此文件夹的权限。您可以通过运行以下命令来解决此问题:

$ docker run -u root -v $(pwd):/usr/src/app:Z my_app_image chown -R node:node /usr/src/app

这将更改主机上文件夹的权限。
或者,如果您需要以root用户身份运行npm install && bower install,您可以将root用户作为默认用户,然后切换到node用户来运行应用程序。例如:
npm install && bower install && gosu node npm start

在这里我使用了gosu工具,需要在镜像中安装。与sudo相比,使用gosu更加方便,因为它不会启动第二个进程。


据我看,第一个命令以root用户身份运行docker镜像,并将/user/src/app文件夹挂载到该用户的权限下, 然后您继续使用chown命令将node用户的权限也赋予该文件夹。 但这对我没有起作用,node用户仍然没有权限, 这是我的docker-compose尝试的要点:https://gist.github.com/avif/8cf231ebda31cba379f9我在Dockerfile中保留了root用户。 - Avi Farada
没有,禁用selinux没有任何影响。 - Avi Farada
但是如果您以root用户身份运行,它是否有效?也许是另一个目录,例如/tmp,需要为node用户授予权限。还要检查是否可以作为Node写入/usr/src/app(例如,在容器中只需运行touch /usr/src/app/test)。 - Adrian Mouat
尝试使用容器中的root用户和touch命令检查写入权限,但是我收到了“权限被拒绝”的错误提示,尽管grunt任务能够更改文件。 - Avi Farada

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