使用Yarn创建目录的权限

Era*_*hel 10 bash node.js npm docker yarnpkg

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

我在我的程序中添加了一个启动脚本package.json来执行shell脚本:

"scripts": {
  "start": "./start-docker.sh",
  ...
}
Run Code Online (Sandbox Code Playgroud)

这是start-docker.sh:

#!/bin/bash

mkdir -p volumes/mysql volumes/wordpress

docker-compose build

docker-compose up
Run Code Online (Sandbox Code Playgroud)

它起初不起作用,因为我的容器无权访问创建的目录.

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

sudo chmod -R 777 volumes
Run Code Online (Sandbox Code Playgroud)

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

我摆脱了shell脚本使用了yarn脚本:

"scripts": {
  "prestart": "mkdir -p volumes/mysql volumes/wordpress && docker-compose build",
  "start": "docker-compose up",
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

Bam*_*ieh 4

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

\n\n

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

\n\n

不同的方法

\n\n

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

\n\n

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

\n\n

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

\n\n
ENTRYPOINT ["yarn"]\nCMD [ "start" ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n

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

\n
\n\n

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

\n\n
    \n
  1. 您摆脱了权限问题,因为直接运行 bash 将允许它创建文件并执行运行它的用户所做的事情。

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

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

  6. \n
  7. dockerCMD可以在运行时更改以运行除start(例如test等)之外的不同包脚本。

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

  10. \n
\n\n

为什么 Yarn 需要权限

\n\n

核心问题是Not in Yarn。这是在呼唤(\xe2\x80\x9cbash ./start-docker.sh\xe2\x80\x9d vs \xe2\x80\x9c./start-docker.sh\xe2\x80\x9d)。

\n\n

./start-docker.sh无论是否通过yarn运行,运行都需要sudo权限。Yarn 不会在改变用户等方面做任何花招。

\n\n
"scripts": {\n  "start": "bash ./start-docker.sh",\n  ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

预先添加bash将解决该问题。再说一次,我真的推荐这个解决方案。将 docker 与您的package.json.

\n\n

感兴趣的人可以了解具体细节:

\n\n

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

\n\n

你可以在这里读更多关于它的内容。

\n