Docker commit生成镜像启动后进入Node REPL无法提供Web服务
问题原因
使用docker commit生成镜像时,默认会完全继承基础镜像node:16的原有配置:默认工作目录为/,默认启动命令(CMD)为node,因此新容器启动后会直接进入Node REPL环境,不会自动执行Web服务启动逻辑。
解决方法(全程无需编写Dockerfile)
你之前已经完成文件拷贝、依赖安装的nodeint容器无需重新修改,直接在commit阶段通过--change参数指定镜像的工作目录和启动命令即可,操作步骤如下:
- 执行带配置修改的commit命令生成可用镜像
docker commit --change='WORKDIR /app' --change='CMD ["npm", "start"]' nodeint nodeapp:v2
命令中两个--change参数作用如下:
--change='WORKDIR /app':将镜像默认工作目录设置为存放代码、安装依赖的/app路径,避免启动时找不到项目文件和依赖--change='CMD ["npm", "start"]':覆盖基础镜像默认的node启动命令,容器启动后自动执行服务启动逻辑
- 清理之前启动失败的测试容器
docker rm -f nodeappcont
- 用新生成的镜像启动容器
docker run -d --name nodeappcont -p 3010:8080 nodeapp:v2
启动后等待1-2秒,访问对应IP的3010端口即可正常看到Hello World返回。
补充说明
如果只是临时测试,不想重新生成镜像,也可以在启动v1版本镜像时手动指定工作目录和启动命令:
docker run -d --name nodeappcont -p 3010:8080 -w /app nodeapp:v1 npm start
但这种方式没有修改镜像本身的默认配置,每次启动都需要手动加参数,不符合生成可直接使用镜像的需求。
内容的提问来源于stack exchange,提问作者okapetanios
相关产品推荐
相关产品推荐

