这是我的 Dockerfile:
FROM node:7
RUN apt-get update && apt-get install -y --no-install-recommends \
rubygems build-essential ruby-dev \
&& rm -rf /var/lib/apt/lists/*
RUN npm install -gq gulp bower
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN npm install
CMD ["gulp", "start:dev"]
Run Code Online (Sandbox Code Playgroud)
当我构建镜像时,npm install 命令的执行速度非常快,输出很少。我实际上是通过 docker-compose 构建它的,它确实安装了一个卷 - 而且我看不到在我的软管上创建的 node_modules 文件夹。当我在此映像上启动容器时,我可以看到没有 node_modules 文件夹。然后我执行 npm install ,一切开始工作 - 安装所有包需要 2-3 分钟,并且确实创建了 node_modules 文件夹。
这里发生了什么?我究竟做错了什么?为什么 npm install 在构建时不起作用,但在运行时起作用?
应该npm install基于你的工作Dockerfile。如果您在没有安装卷的情况下运行映像(DIRNAME:您docker-compose.yml所在的位置),您可以看到创建的文件:
docker run --rm -it DIRNAME_node ls -ahl /usr/src/app
使用 时docker build,所有数据都存储在图像中。因此,您不会看到在主机上创建的任何文件。
如果您挂载一个卷(通常在Linux中,也在Docker容器中),它会覆盖目录。所以你看不到node_modules构建步骤中创建的内容。
我建议您基于 Docker 映像本身进行测试,并且不要挂载卷。然后你就有了一个不可变的 Docker 镜像,它更适合部署。