在一个文件里可以描述一下要制作的镜像,然后执行 docker 命令,根据这个文件里的描述去制作需要的镜像。在我们的这个 w.store.nest 项目的根目录的下面,新建一个文件,名字是 Dockerfile,在这个文件里可以描述一下要制作的镜像。
在文件里可以使用一些指令,描述具体要做的事情,先用 FROM 设置一个基础镜像,我们这个镜像可以基于 node 镜像,具体要用的镜像的 tag 是 10.16.3-buster。 10.16.3 表示这个镜像里面包含的 Node.js 的版本是 10.16.3,后面这个 buster 是一个特定版本的 Debian 操作系统,它是一种 Linux 类型的操作系统。
下面用 WORKDIR 设置一下工作目录,进入到 /usr/src/app ,注意这个位置是镜像里的位置,不是我们自己电脑上的位置。
然后用 COPY 复制一些东西到这个镜像里面,复制的是项目当前目录下面的所有的东西,复制到镜像里的当前目录。
因为上面已经设置了一个工作目录的位置是 /usr/src/app。所以这个 COPY 指令的意思就是,把我们这个目录里所有的文件,复制到镜像的 /usr/src/app 这个目录里面。
一个点表示当前目录。
.dockerignore
注意项目里的有些东西不需要复制到镜像里,可以在项目的根目录下面,再创建一个 .dockerignore 文件,在这个文件里描述一下要忽略掉的东西。
可以先复制一下 .gitignore 文件里的内容,把它们粘贴到这个 .dockerignore 文件里面。 在上面再添加一个 .git 目录。
env
回到 Dockerfile 文件,继续再添加要做的事情,项目需要一个环境变量文件,在生产环境上的环境变量可能跟本地开发的时候不太一样。所以我们可以单独给生产环境准备一个环境变量文件。
复制一份根目录下的 .env ,重命名一下文件,命名为 production.env,暂时不要把这个文件放在版本控制里面,在 .gitignore 这个文件里,再添加一个 production.env ,在项目的源代码管理里面忽略掉这个文件。
打开 production.env,可以编辑一下这个环境变量文件里的内容。这些环境变量的值会用在应用的生产环境上。
继续编辑 Dockerfile,添加一个 COPY 指令,把项目里的 production.env 复制到镜像里,重命名成 .env 。
Dockerfile
下面还得再运行几条命令,用 RUN 这个指令,执行一下 npm config set registry 设置一下 Package 的安装源,可以使用 registry.npm.taobao.org ,在国内使用这个安装源速度可能会快一些。
然后再 RUN 一下 npm install ,安装一下项目的依赖。
还得再运行 npm run build,编译一下我们的应用。 再用 EXPOSE 描述一下运行的服务使用的是哪个端口。我们的应用默认通过 3000 这个端口提供服务。注意这个 EXPOSE 并不是真的公开发布了一个端口,它的作用主要是告诉这个镜像的使用者,运行的服务通过 3000 这个端口提供服务。基于这个镜像创建运行的容器的时候,可以设置具体要发布的端口。
最后再用 CMD 指令设置一下基于这个镜像创建运行的容器的时候,容器里要执行的命令。npm,run,start:prod,启动运行项目的生产服务。