在 docker 内安装 npm 依赖项并从卷进行测试
Installing npm dependencies inside docker and testing from volume
我想使用 Docker 为简单的 node.js 项目创建开发环境。我想在 docker 容器中安装我的项目的依赖项(它们都是 npm 包)(这样它们就不会触及我的主机)并且仍然使用卷挂载我的代码。所以,容器应该能够
在我安装卷的路径中找到 node_modules
文件夹,但我不应该从主机上看到它。
这是我的Docker文件:
FROM node:6
RUN mkdir /code
COPY package.json /code/package.json
WORKDIR /code
RUN npm install
我是这样运行的:
docker build --tag my-dev-env .
docker run --rm --interactive --tty --volume $(pwd):/code my-dev-env npm test
这是我的 package.json:
{
"private": true,
"name": "my-project",
"version": "0.0.0",
"description": "My project",
"scripts": {
"test": "jasmine"
},
"devDependencies": {
"jasmine": "2.4"
},
"license": "MIT"
}
失败是因为找不到jasmine
,所以不是真的安装:
> jasmine
sh: 1: jasmine: not found
我想用Docker可以实现吗?另一种方法是全局安装软件包。我也试了npm install -g
没用
我在 Debian 上 Docker 版本 1.12.1,构建 23cf638。
这里的问题是您正在覆盖 /code
文件夹。
请注意,您在构建时正在执行 npm install
命令,因此创建的图像在 /code
文件夹和 node_modules
文件夹中。问题是您在执行 docker run
命令时在 /code
文件夹中安装了一个卷,因此该文件夹将被您本地计算机的内容覆盖。
一种方法是在 npm test
命令之前执行 npm install
:
docker run --rm --interactive --tty my-dev-env npm install && npm test
此外,为了正常执行命令 jasmine
,您必须如下修改 package.json
:
"scripts": {
"test": "./node_modules/.bin/jasmine"
}
解决方案是也将 /code/node_modules
声明为一个卷,只是不将其绑定安装到主机中的任何目录。像这样:
docker run --rm --interactive --tty --volume /code/node_modules --volume $(pwd):/code my-dev-env npm test
正如@JesusRT 所指出的那样,npm install
工作得很好,但是将 $(pwd)
绑定到 /code
本身就隐藏了图像中 /code
的现有内容.我们可以通过将容器中的 /code
声明为数据卷来恢复我们想要的任何内容——在本例中,只是 /code/node_modules
,如上所示。
Docker-compose: node_modules not present in a volume after npm install succeeds 中已经讨论了一个非常相似的问题。
我想使用 Docker 为简单的 node.js 项目创建开发环境。我想在 docker 容器中安装我的项目的依赖项(它们都是 npm 包)(这样它们就不会触及我的主机)并且仍然使用卷挂载我的代码。所以,容器应该能够
在我安装卷的路径中找到 node_modules
文件夹,但我不应该从主机上看到它。
这是我的Docker文件:
FROM node:6
RUN mkdir /code
COPY package.json /code/package.json
WORKDIR /code
RUN npm install
我是这样运行的:
docker build --tag my-dev-env .
docker run --rm --interactive --tty --volume $(pwd):/code my-dev-env npm test
这是我的 package.json:
{
"private": true,
"name": "my-project",
"version": "0.0.0",
"description": "My project",
"scripts": {
"test": "jasmine"
},
"devDependencies": {
"jasmine": "2.4"
},
"license": "MIT"
}
失败是因为找不到jasmine
,所以不是真的安装:
> jasmine
sh: 1: jasmine: not found
我想用Docker可以实现吗?另一种方法是全局安装软件包。我也试了npm install -g
没用
我在 Debian 上 Docker 版本 1.12.1,构建 23cf638。
这里的问题是您正在覆盖 /code
文件夹。
请注意,您在构建时正在执行 npm install
命令,因此创建的图像在 /code
文件夹和 node_modules
文件夹中。问题是您在执行 docker run
命令时在 /code
文件夹中安装了一个卷,因此该文件夹将被您本地计算机的内容覆盖。
一种方法是在 npm test
命令之前执行 npm install
:
docker run --rm --interactive --tty my-dev-env npm install && npm test
此外,为了正常执行命令 jasmine
,您必须如下修改 package.json
:
"scripts": {
"test": "./node_modules/.bin/jasmine"
}
解决方案是也将 /code/node_modules
声明为一个卷,只是不将其绑定安装到主机中的任何目录。像这样:
docker run --rm --interactive --tty --volume /code/node_modules --volume $(pwd):/code my-dev-env npm test
正如@JesusRT 所指出的那样,npm install
工作得很好,但是将 $(pwd)
绑定到 /code
本身就隐藏了图像中 /code
的现有内容.我们可以通过将容器中的 /code
声明为数据卷来恢复我们想要的任何内容——在本例中,只是 /code/node_modules
,如上所示。
Docker-compose: node_modules not present in a volume after npm install succeeds 中已经讨论了一个非常相似的问题。