我用dockerfile创建了一个简单的hello world node.js应用程序
FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD node index.js
如果我在dockerfile中将CMD更改为RUN,它仍然可以工作。它在dockerfile中记录为使用CMD,因为它将在容器运行时启动节点服务器。
我想知道如果我使用RUN cmd而不是CMD将会在幕后发生什么。基本上,如果我制作一个本身处于运行状态的docker映像,会发生什么。
RUN
将在构建过程中执行命令。当executing容器而不是构建时,CMD
用作默认命令。如果在node index.js
指令中运行RUN
,则构建将永远不会完成,并且您将没有与他人共享的容器。
有关更多详细信息,请参阅dockerfile文档:RUN
和RUN
。
该文档的相关内容:
RUN指令将在当前映像顶部的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步。
CMD的主要目的是为执行中的容器提供默认值。
EDIT:使用OP的CMD
,CMD
和index.json
文件,使用package.json
时,docker映像构建未完成,而使用Dockerfile
时,则完成了(按预期)。 >
RUN node index.js
的内容:
CMD node index.js
index.js
的内容:
//Load express module with `require` directive var express = require('express') var app = express() //Define request response in root URL (/) app.get('/', function (req, res) { res.send('Hello World!') }) //Launch listening server on port 8081 app.listen(8080, function () { console.log('app listening on port 8080!') })
如下使用
package.json
时:
{ "name": "dummy_nodejs_app", "version": "1.0.0", "description": "Node.js on Docker", "author": "Debojit", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.16.1" } }
然后构建挂起。这是输出:
Dockerfile
无限期挂起。
使用Dockerfile时
FROM node:10 WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 8080 RUN node index.js
构建输出为:
jakub@dash:/tmp/test-node$ docker build -t test .
Sending build context to Docker daemon 4.096kB
Step 1/7 : FROM node:10
---> d5680e53a228
Step 2/7 : WORKDIR /usr/src/app
---> Using cache
---> a4b4547833e5
Step 3/7 : COPY package*.json ./
---> Using cache
---> 2b19cc3e48a3
Step 4/7 : RUN npm install
---> Using cache
---> fe1f1e72d17d
Step 5/7 : COPY . .
---> eb6fe0e3d1a7
Step 6/7 : EXPOSE 8080
---> Running in e573b923fcb2
Removing intermediate container e573b923fcb2
---> b3590153eed7
Step 7/7 : RUN node index.js
---> Running in 08b408e6e6f3
app listening on port 8080!
FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD node index.js
步骤使用提供的命令执行一个临时容器,等待该命令退出,然后捕获更改为容器文件系统的另一层,作为结果映像。它不存储正在运行的进程,对环境变量的更改或对Shell状态的任何更改,因为这些操作未写入文件系统。由于临时容器是使用映像中定义的卷启动的,因此它也不会捕获对卷的更改,并且对卷的更改不会应用到容器文件系统。这是一个构建时间步骤。
首先,如果您在构建阶段使用RUN
命令启动任何长时间运行的过程,则构建过程将被卡住。