使用Yarn创build目录的权限

我试图设置一个命令,使用Yarn来创build目录,build立我的Docker镜像,然后启动docker-compose up

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

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

这是start-docker.sh

 #!/bin/bash mkdir -p volumes/mysql volumes/wordpress docker-compose build docker-compose up 

它起初不起作用,因为我的容器没有权限访问创build的目录。

然后,在创build目录之后,为了给容器提供完全的权限,添加了这一行:

 sudo chmod -R 777 volumes 

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

我摆脱了shell脚本使用了纱线脚本

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

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

在运行“dockerized”节点容器的一些经验之后,我提出了一个不同的方法

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

一种不同的方法

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

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

Docker镜像在最后几行中将包含类似于以下内容的内容:

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

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

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

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

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

  2. 它允许非泊坞窗用户通过package.json脚本访问您的节点应用程序,就像它们用来做的一样。

  3. 它允许docker的用户了解docker映像正在做什么,因为它将在安装过程之后最终运行package.json脚本。 它还允许更改入口而不更改bash或docker文件。

  4. docker工CMD可以在运行时更改为运行不同的包脚本,而不是start (如test等)。

  5. 删除docker运行项目的依赖关系,这很重要,因为docker并不是通过yarn install从而使软件包本身成为“非真实”的软件包。

为什么纱要求权限

核心问题是纱线不在 。 它在调用( “bash ./start-docker.sh” “./start-docker.sh” )。

运行./start-docker.sh将需要sudo权限,无论是否通过纱线运行。 纱不会改变用户或类似的东西。

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

预先添加bash将解决问题。 再一次,我真的推荐这个解决scheme。 从你的package.json分离docker。

对于那些感兴趣的细节细节:

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

你可以在这里阅读更多。