使用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
分开的一些附加好处:
-
你摆脱了权限问题,因为直接运行bash将允许它创build文件,并执行运行它的用户所拥有的东西。
-
它允许非泊坞窗用户通过
package.json
脚本访问您的节点应用程序,就像它们用来做的一样。 -
它允许docker的用户了解docker映像正在做什么,因为它将在安装过程之后最终运行
package.json
脚本。 它还允许更改入口而不更改bash或docker文件。 -
docker工
CMD
可以在运行时更改为运行不同的包脚本,而不是start
(如test
等)。 -
删除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
只需要可读的位。 执行位需要权限。
你可以在这里阅读更多。