【问题标题】:Permissions to created directories using Yarn使用 Yarn 创建目录的权限
【发布时间】:2017-08-25 06:42:33
【问题描述】:

我尝试使用 Yarn 设置命令来创建目录、构建我的 Docker 映像,然后启动 docker-compose up

我在package.json 中添加了一个start 脚本来执行一个shell 脚本

"scripts": {
  "start": "./start-docker.sh",
  ...
}

这是start-docker.sh

#!/bin/bash

mkdir -p volumes/mysql volumes/wordpress

docker-compose build

docker-compose up

一开始没有用,因为我的容器无权访问创建的目录。

然后我在创建目录后添加了这一行,以便为容器提供完全权限:

sudo chmod -R 777 volumes

但是正如你所看到的,这个命令需要使用 sudo 来执行。这意味着执行yarn start 命令会要求输入密码,这是我不想要的。

我摆脱了 shell 脚本,只使用了 yarn 脚本

"scripts": {
  "prestart": "mkdir -p volumes/mysql volumes/wordpress && docker-compose build",
  "start": "docker-compose up",
  ...
}

令人惊讶的是它起作用了,但我不明白为什么......你们有什么想法吗?

【问题讨论】:

  • 一旦目录具有权限 777,它就会保留此权限。您确定每次都重新创建所有内容吗?
  • 不,它不是每次都创建的,但我需要设置一次权限才能使其工作
  • 这看起来像是用户的问题。 yarn创建目录和运行容器时,运行流畅,但是当目录由yarn创建,并通过脚本运行时,用户发生了变化。在适当的时候使用whoami 来验证这一点。
  • @Ayushya 它将在相同的用户下运行,具有相同的权限。如果您有兴趣,我在回答中解释了发生的事情

标签: node.js bash docker npm yarnpkg


【解决方案1】:

在运行“dockerized”节点容器的一些经验之后,我建议不同的方法

为了实现您的目标,我们将采取不同的方法,我认为这是一种更好的做法,因为它可以解决手头的问题以及其他一些未提出的问题。

另一种方法

包脚本旨在运行从依赖项或包内容安装的 javascript。 package.json 文件应该只有你的节点应用程序的入口,不是你的 docker 容器

现在您将拥有一个单独的 bash 文件,您可以在“dockerized 环境”中运行该文件来启动节点。 package.json 运行您的节点文件。

docker 图像的最后几行将包含类似于以下内容的内容:

ENTRYPOINT ["yarn"]
CMD [ "start" ]

由于在运行映像之前需要执行额外的步骤(在本地运行 mkdir),因此您可以从命令行运行 bash ./start-docker.sh 来运行脚本,而不是通过 yarn。

docker 镜像将运行您的 package.json 脚​​本,而不是相反。

以下是将 docker 与 package.json 分开的一些额外好处:

  1. 您摆脱了权限问题,因为直接运行 bash 将允许它创建文件并执行运行它的用户所拥有的操作。

  2. 它允许非 docker 用户通过 package.json 脚本访问您的节点应用程序,就像他们习惯做的那样。

  3. 它允许 docker 的用户了解 docker 镜像在做什么,因为它最终会在设置过程之后运行 package.json 脚本。它还允许在不更改 bash 或 docker 文件的情况下更改入口。

  4. 可以在运行时更改 docker CMD 以运行 start 以外的不同包脚本(例如 test 等)。

  5. 删除 docker 的依赖来运行项目,这很重要,因为 docker 不是通过 yarn install 安装的,这使得包本身成为“非真实”包。

为什么 Yarn 需要权限

核心问题是不在 Yarn 中。它正在调用中(“bash ./start-docker.sh” vs “./start-docker.sh”)。

运行 ./start-docker.sh 将需要 sudo 权限,无论是否通过 yarn 运行它。 Yarn 并没有在改变用户等方面做任何噱头。

"scripts": {
  "start": "bash ./start-docker.sh",
  ...
}

预先添加bash 将解决此问题。同样,我真的推荐这个解决方案。将 docker 与您的 package.json 分开。

为感兴趣的人提供详细信息:

./start-docker.sh 需要执行和可读位,而bash ./start-docker.sh 只需要可读位。执行位需要权限。

您可以阅读更多关于它的信息here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    相关资源
    最近更新 更多