node.js - 如果我在 dockerfile 中写入 RUN node index.js 而不是 CMD node index.js 会发生什么?
问题描述
我用 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
将在构建过程中执行命令。在执行CMD
容器时用作默认命令,而不是构建。如果您在指令中运行,您的构建将永远不会完成,并且您没有与他人共享的容器。node index.js
RUN
有关更多详细信息,请参阅 dockerfile 文档:RUN
和CMD
.
该文档中的相关位:
RUN 指令将在当前图像之上的新层中执行任何命令并提交结果。生成的提交图像将用于 Dockerfile 中的下一步。
CMD 的主要目的是为执行容器提供默认值。
编辑:使用 OP 的index.json
、package.json
和Dockerfile
文件,docker 映像构建在使用时未完成,并且在使用时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
如下:
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!
这无限期挂起。
使用 Dockerfile 时
FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD 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 . .
---> Using cache
---> fc036f428e34
Step 6/7 : EXPOSE 8080
---> Using cache
---> d1ede7276d34
Step 7/7 : CMD node index.js
---> Using cache
---> cf051929395b
Successfully built cf051929395b
Successfully tagged test:latest
推荐阅读
- python - Pandas to_csv 只写入来自特定页面的数据
- javascript - 使用 PHP 和 JQuery 在 Wordpress 中具有多个输入的 Ajax 搜索表单 数据获取
- node.js - Nodejs等待mysql2结果,然后继续执行
- html - 为什么通过javascript访问时div的初始状态没有价值?
- javascript - Google Maps geocode() 循环放置标记
- jackson - CsvMapper 将 Null 字段序列化为 Literal null
- python-3.x - 如果一列 str.contain 包含 Pandas 中的特定字符,则合并两列
- python - 如何将记录器格式和处理程序设置传递给模块?
- vba - VBA - 按降序打印
- bash - Bash:将 (+=) 附加到 nameref (-n) 到哈希键