使用 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
分开的一些额外好处:
您摆脱了权限问题,因为 运行ning bash 直接将允许它创建文件并执行 运行 它的用户的操作有。
它允许非docker用户通过package.json
脚本访问您的节点应用程序,就像他们习惯做的那样。
它允许 docker 的用户了解 docker 图像在做什么,因为它最终会 运行 一个 package.json
脚本设置过程。它还允许在不更改 bash 或 docker 文件的情况下更改 ent运行ce。
docker CMD
可以在 运行 时更改为 运行 除 start
之外的不同包脚本(例如test
等)。
删除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。
我正在尝试使用 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
分开的一些额外好处:
您摆脱了权限问题,因为 运行ning bash 直接将允许它创建文件并执行 运行 它的用户的操作有。
它允许非docker用户通过
package.json
脚本访问您的节点应用程序,就像他们习惯做的那样。它允许 docker 的用户了解 docker 图像在做什么,因为它最终会 运行 一个
package.json
脚本设置过程。它还允许在不更改 bash 或 docker 文件的情况下更改 ent运行ce。docker
CMD
可以在 运行 时更改为 运行 除start
之外的不同包脚本(例如test
等)。删除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。