Node.js服务Docker容器化应用实践小结

2020-06-17 06:39:08易采站长站整理

CMD npm run dev

在 Dockerfile 的同级文件下创建一个 .dockerignore 文件,避免将你本地的调试文件、node_modules 等一些文件放入 Docker 容器中


.git
node_modules
npm-debug.log

此时通过以下命令即可构建一个 Docker 镜像


$ docker image build -t mayjun/hello-docker

再通过 docker run -d -p 30010:30010 mayjun/hello-docker 命令可运行一个 Docker 容器,但是有个疑问我是有生产和测试之分的,按照上面

CMD npm run dev
这样写死只能打包一种环境,当然你也可以在建一个文件来实现或者一些其它的方法。

动态设置环境变量

为了解决上面的疑问,我的想法是在镜像构建时传入参数来动态设置环境变量,对 Dockerfile 文件做下修改,看以下实现:


EXPOSE 30010

ARG node_env # 新增加
ENV NODE_ENV=$node_env # 新增加
CMD npm run ${NODE_ENV} # 修改

下面对上面的代码做个解释

通过 ARG 指令定义了一个变量,用户可以在构建时通过使用 –build-arg = 标志的 docker build 命令将其传递给构建器 ARG node_env
在 Dockerfile 中使用 ENV 引用这个变量 ENV NODE_ENV=$node_env
这一步就是使用了 CMD npm run ${NODE_ENV}

剩下的就是在构建镜像时动态传入参数了


$ docker image build --build-arg node_env=dev -t mayjun/hello-docker:1.0.2 . # 构建测试环境
$ docker image build --build-arg node_env=pro -t mayjun/hello-docker:1.0.2 . # 构建生产环境

运行容器


$ docker run -d -p 30010:30010 mayjun/hello-docker:1.0.2
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2bc6e62cd0e8 mayjun/hello-docker:1.0.2 "/bin/sh -c 'npm run…" 3 minutes ago Up 3 minutes 0.0.0.0:30010->30010/tcp elastic_bouman

查看容器日志


docker logs -f 2bc6e62cd0e8

> hello-docker@1.0.0 dev /usr/src/nodejs
> NODE_ENV=dev node app.js

Running on http://localhost: 30010 NODE_ENV dev

我将以上代码打包成了镜像 mayjun/hello-docker:1.0.2,可以拉取查看 docker pull mayjun/hello-docker:1.0.2

Docker 与 Node.js 私有 NPM 包

如果你的项目中使用了私有 NPM 包,在 Dcoker 构建镜像过程中会出现 npm 私有包安装 404 的错误,如果是在容器外部我们可以 npm login 登陆拥有 NPM 私有包权限的账户,来解决这个问题,但是在 Docker 的时候是不能这样做的。

创建身份验证令牌

为了安装私有包我们需要 “创建身份验证令牌