Dockerfile示例:Node.js

# 基于一个NodeJS基础镜像
FROM maichong/node:8.9.3

# 设置镜像系统时区,可选
RUN echo "Asia/Shanghai" > /etc/timezone
ENV TZ=CST-8

# 指定工作目录
WORKDIR /app

# 根据需要执行apt-get命令安装更多的软件,使用 RUN 关键字,其实就是在容器中执行任意的命令
# 将多个Linux命令使用 && 相连,纳入到一条 RUN 指令中,可以使得生成的镜像最小化
RUN apt-get update \
  && apt-get install -y --no-install-recommends openssh-client \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

# 拷贝 Node.js 项目的 package.json 文件拷贝到目标镜像的目录 /app 中
COPY package.json /app/

# 安装 npm 依赖
# 使用 --production 关键字只安装生产环境的依赖 dependencies,
# 不安装开发环境依赖 devDependencies,可以使得生成的镜像最小化
RUN npm install --production \
  && rm -R ~/.npm*

# 将 Node.js 项目文件拷贝到镜像的 /app 目录中, . 代表Dockerfile所在的目录
COPY . /app

# 设置容器运行时默认执行的命令
# 这里是在 /app 工作目录中启动 server.js 脚本
CMD node server.js

# 声明需要监听的端口
EXPOSE 8080

注意在上述的 Dockerfile 内容中,有一个关键技巧,就是首先将 package.json 拷贝到镜像中,然后 npm 安装,最后再拷贝项目文件。

这样做的原因是,对于Node.js项目而言,项目文件是每一次升级都需要更改的,而 package.json 不需要经常修改,那么,先将不经常变化的 package.json 拷贝到镜像中安装依赖,可以使得这个步骤缓存起来,下次运行镜像打包的时候就能直接用这次的缓存,不用每次都调用npm安装。

同时,在 COPY . /app 拷贝项目目录的时候,不应该拷贝 node_modules 目录,具体做法是在项目中增加 .dockerignore 文件,忽略掉不需要打包的文件:

.git
.history
node_modules
runtime

results matching ""

    No results matching ""