【问题标题】:Files created inside docker are write protected on host在 docker 中创建的文件在主机上被写保护
【发布时间】:2016-11-08 02:26:15
【问题描述】:

我正在将 docker 容器用于 rails 和 ember。我正在将源从本地安装到容器。我在本地所做的所有更改都会反映在容器中。

现在我想使用generators 创建文件。文件已创建,但它们在我的机器上受到写保护。

当我尝试执行docker-compose run frontend bash 时,我会在容器内获得root@061e4159d4ef:/frontend# 超级用户提示访问权限。当我处于这种模式时,我可以创建文件。这些文件在我的主机中受到写保护。

我也试过docker-compose run --user "$(id -u):$(id -g)" frontend bash,我得到一个I have no name!@31bea5ae977c:/frontend$,我无法在这种模式下创建任何文件。以下是我收到的错误消息。

I have no name!@31bea5ae977c:/frontend$ ember g template about
/frontend/node_modules/ember-cli/node_modules/configstore/node_modules/mkdirp/index.js:90
                    throw err0;
                    ^

Error: EACCES: permission denied, mkdir '/.config'
    at Error (native)
    at Object.fs.mkdirSync (fs.js:916:18)
    at sync (/frontend/node_modules/ember-cli/node_modules/configstore/node_modules/mkdirp/index.js:71:13)
    at Function.sync (/frontend/node_modules/ember-cli/node_modules/configstore/node_modules/mkdirp/index.js:77:24)
    at Object.create.all.get (/frontend/node_modules/ember-cli/node_modules/configstore/index.js:39:13)
    at Object.Configstore (/frontend/node_modules/ember-cli/node_modules/configstore/index.js:28:44)
    at clientId (/frontend/node_modules/ember-cli/lib/cli/index.js:22:21)
    at module.exports (/frontend/node_modules/ember-cli/lib/cli/index.js:65:19)
    at /usr/local/lib/node_modules/ember-cli/bin/ember:26:3
    at /usr/local/lib/node_modules/ember-cli/node_modules/resolve/lib/async.js:44:21

这是我的Dockerfile

FROM node:6.2

ENV INSTALL_PATH /frontend
RUN mkdir -p $INSTALL_PATH

WORKDIR $INSTALL_PATH

# Copy package.json separately so it's recreated when package.json
# changes.
COPY package.json ./package.json
RUN npm install
COPY . $INSTALL_PATH
RUN npm  install -g phantomjs bower ember-cli ;\
    bower --allow-root install

EXPOSE 4200
EXPOSE 49152

CMD [ "ember", "server" ]

这是我的docker-compose.yml文件,请注意它不在当前目录,而是在父目录。

frontend:
   build: "frontend/"
   dockerfile: "Dockerfile"
   environment:
      - EMBER_ENV=development
   ports:
      - "4200:4200"
      - "49152:49152"
   volumes:
      - ./frontend:/frontend

我想知道,如何使用生成器?我是学习 docker 的新手。任何帮助表示赞赏。

【问题讨论】:

  • 你在使用 boot2docker 吗?
  • 我不使用 Ubuntu 14.04

标签: ember.js docker docker-compose


【解决方案1】:

你得到I have no name! 因为这个:$(id -u):$(id -g) 您主机中的用户 ID 和组未链接到您容器中的任何用户。

解决办法:

执行chown UID:GID -R /frontend inside 如果容器已经在运行并且由于某种原因您无法停止它。否则,您可以在主机中执行 chown 命令,然后再次运行您的容器。 UID 和 GID必须属于容器内用户的节点

例如:chown 101:101 -R /frontend 101 是 www-data 的 UID:GID。

如果您的容器中没有除 root 以外的其他用户,您将必须创建一个新用户。为此,您必须创建一个 Dockerfile 并输入如下内容:

FROM your_image_name
RUN useradd -ms /bin/bash newuser

有关 Dockerfiles 的更多信息可以在 here 或通过谷歌搜索找到。

【讨论】:

  • 由于某种原因无法停止是什么意思?
  • 我不知道,如果你在生产或什么的。
  • 不,它正在开发中。为此,我似乎必须在与我的本地用户相对应的容器内创建一个用户。
  • @AnkitSinghaniya 是的,你应该。你没有其他选择。您必须创建一个 Dockerfile,在其中创建该用户。如果您不知道该怎么做,我会更新我的答案。
  • @Fares 这个工作流程对我来说似乎并不自然。 Docker 意味着可移植并在任何地方使用。这不允许我的其他开发人员轻松集成。还有另一种方法我也在尝试。如果这不起作用,我会将其标记为正确。
猜你喜欢
  • 1970-01-01
  • 2017-01-20
  • 2017-04-19
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
相关资源
最近更新 更多