使用 Yarn 创建目录的权限

Permissions to created directories using Yarn

我正在尝试使用 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",
  ...
}

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

在使用 运行ning "dockerized" 节点容器的一些经验之后,我建议使用 不同的方法

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

一种不同的方法

软件包脚本旨在 运行 javascript 从依赖项或软件包内容安装。 package.json 文件应该只包含您的节点应用程序的条目运行ces,不包含您的 docker 容器

现在您将有一个单独的 bash 文件,您 运行 在 "dockerized environment" 中启动节点。而 package.json 运行 是您的节点文件。

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

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

由于在 运行 图像(运行在本地 mkdir 之前你有额外的步骤要做,你可以 运行 bash ./start-docker.sh 从运行 脚本的命令行,而不是通过 yarn。

The docker image will run your package.json scripts and not the other way around.

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

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

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

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

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

  5. 删除docker对运行项目的依赖,这很重要,因为docker不是通过yarn install安装的,使包成为一个"non-real" 包本身。

为什么 Yarn 需要权限

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

运行 ./start-docker.sh 需要 sudo 权限,无论 运行 是否通过纱线。 Yarn 不会在更改用户等方面做任何噱头。

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

预先添加 bash 即可解决问题。同样,我确实推荐这个解决方案。将 docker 与 package.json.

分开

感兴趣的人的具体细节:

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

您可以阅读更多相关信息 here