这是我的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在构建时没有安装,但是它在运行时运行?
答案 0 :(得分:1)
在Windows 10上,我在该问题中报告了相同的问题,经过一些研究,我发现了一个问题,其中包含解决该问题的必要步骤。
简而言之,主要问题是在安装向导期间,我选择了“ Windows作为容器”选项。
解决问题:
1)切换到Linux容器:在任务栏上,右键单击docker图标,然后单击下面显示的选项:
2)在命令行上禁用“实验功能”:打开docker / settings并单击命令行:
3)在配置文件上禁用实验性设置::在docker / settings上,单击Docker Engine并确认实验性设置为false:
找到解决方案的问题与尝试构建docker映像时遇到的另一个问题有关:Unspecified error (0x80004005) while running a Docker build。这两个问题都与同一个问题有关:首次安装docker时,我选择了“将窗口作为容器”选项。。 希望能帮助到你。干杯
答案 1 :(得分:0)
npm install
应该根据您的Dockerfile
开展工作。如果您在没有装入卷的情况下运行图像,则可以看到创建的文件(DIRNAME
:docker-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