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)
令人惊讶的是它有效,但我不明白为什么......你们有什么想法吗?
在运行“dockerized”节点容器的一些经验之后,我建议采用不同的方法。
\n\n为了实现您的目标,我们将采取不同的方法,我认为这是更好的做法,因为它解决了手头的问题以及其他一些未提出的问题。
\n\n包脚本旨在运行从依赖项或包内容安装的 javascript。该package.json
文件应该仅包含您的节点应用程序的入口,而不是您的 docker 容器的入口。
现在,您将拥有一个单独的 bash 文件,您可以运行该文件来在“dockerized 环境”中启动节点。当package.json
运行您的节点文件时。
docker 映像的最后几行将包含类似于以下内容的内容:
\n\nENTRYPOINT ["yarn"]\nCMD [ "start" ]\n
Run Code Online (Sandbox Code Playgroud)\n\n由于在运行图像(本地运行)之前需要执行额外的步骤mkdir
,因此您可以bash ./start-docker.sh
从命令行运行脚本,而不是通过yarn。
\n\n\ndocker 镜像将运行您的
\npackage.json
脚本,而不是相反。
以下是将 docker 与 docker 分离的一些额外好处package.json
:
您摆脱了权限问题,因为直接运行 bash 将允许它创建文件并执行运行它的用户所做的事情。
它允许非 docker 用户通过脚本访问您的节点应用程序package.json
,就像他们习惯做的那样。
它允许 docker 用户了解 docker 镜像正在做什么,因为它最终会package.json
在设置过程后运行脚本。它还允许在不更改 bash 或 docker 文件的情况下更改入口。
dockerCMD
可以在运行时更改以运行除start
(例如test
等)之外的不同包脚本。
删除对 docker 的依赖来运行项目,这很重要,因为 docker 不是通过yarn install
使包本身成为“非真实”包来安装的。
核心问题是Not in Yarn。这是在呼唤(\xe2\x80\x9cbash ./start-docker.sh\xe2\x80\x9d
vs \xe2\x80\x9c./start-docker.sh\xe2\x80\x9d
)。
./start-docker.sh
无论是否通过yarn运行,运行都需要sudo权限。Yarn 不会在改变用户等方面做任何花招。
"scripts": {\n "start": "bash ./start-docker.sh",\n ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n预先添加bash
将解决该问题。再说一次,我真的不推荐这个解决方案。将 docker 与您的package.json
.
需要./start-docker.sh
执行和可读位,而bash ./start-docker.sh
仅需要可读位。执行位需要权限。
你可以在这里读更多关于它的内容。
\n 归档时间: |
|
查看次数: |
1037 次 |
最近记录: |