npm install在Docker

时间:2017-04-07 22:32:12

标签: docker npm

这是我的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"]

当我构建映像时,npm install命令以很少的输出执行并且非常快。我实际上是通过docker-compose构建的,它确实安装了一个卷 - 我看不到在我的软管上创建的node_modules文件夹。当我在此图像上启动容器时,我可以看到没有node_modules文件夹。然后我执行npm install并开始工作 - 安装所有软件包需要2-3分钟,而且确实创建了node_modules文件夹。

这里发生了什么?我究竟做错了什么?为什么npm install在构建时没有安装,但是它在运行时运行?

3 个答案:

答案 0 :(得分:1)

在Windows 10上,我在该问题中报告了相同的问题,经过一些研究,我发现了一个问题,其中包含解决该问题的必要步骤。

简而言之,主要问题是在安装向导期间,我选择了“ Windows作为容器”选项。

解决问题

1)切换到Linux容器:在任务栏上,右键单击docker图标,然后单击下面显示的选项:

enter image description here

2)在命令行上禁用“实验功能”:打开docker / settings并单击命令行:

enter image description here

3)在配置文件上禁​​用实验性设置::在docker / settings上,单击Docker Engine并确认实验性设置为false:

enter image description here

找到解决方案的问题与尝试构建docker映像时遇到的另一个问题有关:Unspecified error (0x80004005) while running a Docker build。这两个问题都与同一个问题有关:首次安装docker时,我选择了“将窗口作为容器”选项。。 希望能帮助到你。干杯

答案 1 :(得分:0)

npm install应该根据您的Dockerfile开展工作。如果您在没有装入卷的情况下运行图像,则可以看到创建的文件(DIRNAMEdocker-compose.yml所在的位置):

docker run --rm -it DIRNAME_node ls -ahl /usr/src/app

使用docker build,所有数据都存储在图像中。因此,您不希望在主机上看到任何文件。

如果您安装卷(通常在Linux中,也在Docker容器中),则为overlays the directory。因此,您无法看到在构建步骤中创建的node_modules

我建议您根据Docker镜像本身进行测试,不要安装卷。然后你有一个immutable Docker image,这更适合部署。

答案 2 :(得分:0)

复制源代码并运行npm install意味着,只要源代码发生更改,npm install步骤缓存就将无效。

相反,像这样将步骤/缓存分开;

     PROJECT_NAME|UUID|MSISDN|START