Dockerfile从零入门:手把手教你打包Node.js应用,解决镜像构建的常见坑
代码写完了在本地跑得好好的怎么把它打包成Docker镜像部署到服务器上答案就是Dockerfile。今天这篇文章我们用Node.js应用做例子从零开始写一个Dockerfile把应用打包成镜像顺便把常见的坑都踩一遍。一、Dockerfile是什么Dockerfile是一个文本文件里面写着“如何构建这个镜像”的所有指令。它就像一张蓝图Docker按照这张蓝图把应用打包成镜像。重要文件名必须叫Dockerfile首字母大写没有后缀名。二、写一个最简单的Dockerfile我们的Node.js应用需要运行在Node环境里所以第一件事是找一个带Node的基础镜像dockerfileFROM node:20-alpineFROM是所有Dockerfile的第一行指定基础镜像。这里用了node:20-alpine——一个轻量级的Node镜像体积小适合生产环境。三、复制代码并安装依赖把代码复制进镜像然后安装依赖dockerfile# 创建应用目录 RUN mkdir -p /home/app # 复制所有文件 COPY . /home/app # 设置工作目录 WORKDIR /home/app # 安装依赖 RUN npm install注意几点RUN是在构建镜像时执行的命令COPY是从宿主机复制文件到镜像里WORKDIR设置工作目录后面的命令都会在这个目录下执行一个常见错误不要把本地的node_modules复制进镜像。因为本地依赖可能是旧版本应该在镜像里重新npm install保证依赖是最新的。四、指定启动命令最后告诉容器启动时运行什么dockerfileCMD [node, server.js]CMD是容器启动时执行的命令。一个Dockerfile只能有一个CMD。完整的DockerfiledockerfileFROM node:20-alpine ENV MONGO_DB_USERNAMEadmin \ MONGO_DB_PWDpassword RUN mkdir -p /home/app COPY . /home/app WORKDIR /home/app RUN npm install CMD [node, server.js]五、构建镜像在Dockerfile所在目录执行bashdocker build -t my-app:1.0 .-t my-app:1.0给镜像起名字和版本号.Dockerfile所在的路径当前目录构建完成用docker images就能看到新镜像。六、运行容器bashdocker run my-app:1.0如果一切正常你会看到app listening on port 3000!。如果报错用docker logs查看日志。七、踩坑与解决坑1找不到server.js现象启动容器报错Error: Cannot find module /server.js。原因没有设置WORKDIRCMD里的相对路径找不到文件。解决加上WORKDIR /home/app。坑2进入容器报错bash: not found现象docker exec -it 容器ID /bin/bash报错。原因Alpine基础镜像没有安装bash。解决用/bin/sh代替/bin/bash。bashdocker exec -it 容器ID /bin/sh坑3修改Dockerfile后镜像没变现象改了Dockerfile重新构建后还是老样子。原因Docker不会自动删除旧镜像你还在用旧的。解决先删旧容器再删旧镜像最后重新构建。bash# 查看所有容器包括已停止的 docker ps -a # 删除旧容器 docker rm 容器ID # 删除旧镜像 docker rmi my-app:1.0 # 重新构建 docker build -t my-app:1.0 .八、优化只复制需要的文件上面的例子把整个项目目录都复制进了镜像包括Dockerfile、README等不需要的文件。可以这样优化dockerfile# 只复制app目录下的文件 COPY ./app /home/app或者用.dockerignore文件排除不需要的文件类似.gitignore。写在最后Dockerfile的核心就几条指令FROM选基础镜像COPY复制代码RUN装依赖CMD定启动命令。记住几个关键点文件名必须是DockerfileRUN是构建时执行CMD是启动时执行修改Dockerfile后要先删旧镜像再重新构建轻量镜像用/bin/sh而不是/bin/bash掌握了这些你就能把任何应用打包成Docker镜像了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2494075.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!