如果我在dockerfile中编写RUN节点index.js而不是CMD节点index.js会发生什么?

问题描述 投票:0回答:3

我用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映像,会发生什么。

node.js docker dockerfile docker-image docker-run
3个回答
2
投票

RUN将在构建过程中执行命令。当executing容器而不是构建时,CMD用作默认命令。如果在node index.js指令中运行RUN,则构建将永远不会完成,并且您将没有与他人共享的容器。

有关更多详细信息,请参阅dockerfile文档:RUNRUN

该文档的相关内容:

RUN指令将在当前映像顶部的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步。

CMD的主要目的是为执行中的容器提供默认值。


EDIT:使用OP的CMDCMDindex.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!

1
投票

FROM node:10 WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 8080 CMD node index.js 步骤使用提供的命令执行一个临时容器,等待该命令退出,然后捕获更改为容器文件系统的另一层,作为结果映像。它不存储正在运行的进程,对环境变量的更改或对Shell状态的任何更改,因为这些操作未写入文件系统。由于临时容器是使用映像中定义的卷启动的,因此它也不会捕获对卷的更改,并且对卷的更改不会应用到容器文件系统。这是一个构建时间步骤。


0
投票

首先,如果您在构建阶段使用RUN命令启动任何长时间运行的过程,则构建过程将被卡住。

© www.soinside.com 2019 - 2024. All rights reserved.