CMD和ENTRYPOINT命令
CMD
命令
CMD
命令在使用时,有三个基本原则需要我们遵守。
- 容器启动时默认执行的命令
- 如果
docker container run
启动容器时指定了其它命令,则CMD命令会被忽略- 如果定义多个CMD,只有最后一个CMD执行
app.js
let koa = require("koa")
let Router = require("koa-router")
const app = new koa();
const router = new Router();
router.get("/", async ctx => {
ctx.body = "村望老弟的Docker测试服务器测试数据"
})
app.use(router.routes())
app.listen({
port: 3000
}, () => {
console.log("村望老师的Docker测试服务器跑起来啦");
})
dockerfile
FROM node:15.10.0-slim
ADD ./app.tar.gz /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
CMD node app.js
容器启动的时候执行CWD
ENTRYPOINT
命令
ENTRYPOINT
也可以设置容器启动时要执行的命令。使用起来的语法很简单
ENTRYPOINT和CMD的区别
CMD
设置的命令,可以在docker container run
时传入其它命令,覆盖掉CMD
的命令,但是ENTRYPOINT
所设置的命令时一定会被执行的。先看
CMD
配置的命令dockerfile.cmd
FROM ubuntu:21.04 CMD ["echo","hello docker"]
构建镜像
docker image build -f dockerfile.cmd -t cmd-test .
codehope ~/CunWangOwn/docke-file-test docker run cmd-test hello docker
但是我们可以在
run
的时候去覆盖内部的CMD
命令codehope ~/CunWangOwn/docke-file-test docker run cmd-test ls bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
可以看到
CMD ["echo","hello docker"]
并没有执行!然后看
ENTRYPOINT
配置的命令dockerfile.entrypoint
FROM ubuntu:21.04 ENTRYPOINT ["echo","hello docker"]
构建镜像
docker image build -f dockerfile.entrypoint -t entry-test .
运行镜像
codehope ~/CunWangOwn/docke-file-test docker run entry-test ls hello docker ls
发现无法被覆盖,好像能传参数的赶脚?
ENTRYPOINT
和CMD
可以联合使用,ENTRYPOINT
设置执行的命令,CMD传递参数。dockerfile.cmdentrymix
FROM ubuntu:21.04 ENTRYPOINT ["echo"] CMD []
构建镜像
docker image build -f dockerfile.cmdentrymix -t cemixin .
运行镜像
codehope ~/CunWangOwn/docke-file-test docker run cemixin input input
本作品采用《CC 协议》,转载必须注明作者和本文链接