命令
-
CP 复制本地文件到镜像内。
示例:CP . /target,表示复制本地当前目录内的所有文件到镜像内的target目录
-
WORKDIR 容器运行时的工作目录。
示例:WORKDIR /target,表示容器运行时的工作目录是/target
-
RUN 在打包镜像时(docker build)会执行RUN后面的命令。
示例:RUN npm install pm2 -g,表示打包镜像时会在镜像内安装pm2
-
CMD 在运行容器时(docker run image)会执行CMD后面的命令。
CMD运行完成后,Docker容器会停止运行。
Dockerfile如果有多个CMD,只会执行文件内最后一个CMD命令。
示例:CMD node ./app.js,表示执行工作目录内target/app.js文件
-
EXPOSE 声明镜像运行后,容器暴露的端口。只是一个声明,无实际意义,端口映射还是需要在run image时自己去使用-p处理
示例:EXPOSE 3000,对外暴露3000端口
构建镜像后,容器运行后就退出的问题
COPY . /target
WORKDIR /target
RUN npm install pm2 -g
EXPOSE 3000
RUN npm install
CMD ["pm2", "start", "./app.js"]
描述:构建镜像后,node使用pm2做守护的情况下,容器运行成功后就会退出(exit 0)。
原因:容器启动后,如果CMD后的命令执行完成,容器就会退出,同时pm2是在后台执行的。
所以这个时候我们就需要使用pm2-runtime让pm2保持一直处于前台运行的状态,这样容器就不会退出了,所以我们这时就要把CMD改一下:
CMD ["pm2-runtime", "start", "./src/app.js"]。
所以我们在构建镜像时需要注意CMD后的命令会不会一直保存在前台运行。