2017-03-31 142 views
0

我们使用Docker来构建/部署NodeJS应用程序。我们有一个由Jenkins构建的test容器,并执行我们的单元测试。该Dockerfile看起来是这样的:码头集装箱内的rsync文件?

FROM node:boron 

# <snip> some misc unimportant config here 

# Run the tests 
ENTRYPOINT npm test 

我想修改这一步,让我们运行npm run test:cov,运行单元测试+生成覆盖率报告的HTML文件。我修改了Dockerfile来说:

# Run the tests + generate coverage 
ENTRYPOINT npm run test:cov 

...哪些工作。好极了!

...但现在我不确定如何将覆盖率报告(由Dockerfile中的上述命令生成)覆盖报告到远程服务器。

在詹金斯,上述的配置被调用这种方式:

docker run -t test --rm 

其中,再次,运行上述测试和存在该容器。

如何在entrypoint命令执行后添加一些额外的步骤,例如将rsync的某些结果输出到远程服务器?

回答

0

制作脚本以执行入口点并将这些命令放入脚本中。调用docker run时,您传入参数并将其传递给脚本。

该文档有一个postgres图像脚本的例子。你可以建立起来。

Docker Entrypoint Docs

0

我不是一个“节点”专家,所以在细节上多多包涵。

首先,您可以考虑是否需要单独的Dockerfile来运行测试。理想情况下,您希望构建图像,然后进行测试,而不修改实际图像。

建立该应用程序使用您的NodeJS作为基础图像(FROM my-nodejs-image)的测试图像可以做的伎俩,但如果所有你需要做的就是在运行不同命令/入口点可能不需要图片。

其次;有状态数据(覆盖报告属于该类别)不应该存储在容器内(即,不存储在容器的文件系统中)。你希望你的容器是短暂的,并且任何超出容器生命周期的东西(在容器本身消失后应该保留的任何东西)应该被存储在容器的外部之外;无论是在“卷”还是在一个绑定安装的目录中。

让我从“单独的Dockerfile”开始。假设您的NodeJS应用程序Dockerfile看起来像这样;

FROM node:boron 

COPY package.json /usr/src/app/ 
RUN npm install && npm cache clean 
COPY . /usr/src/app 

CMD [ "npm", "start" ] 

您可以构建您的图像,并使用其构建的提交对其进行标记;例如,

docker build -t myapp:$GIT_COMMIT . 

一旦图像构建成功,您想要测试它。可能是一个快速测试,以验证它实际上“运行”。有很多方法可以做到这一点,或许是这样的;

docker run \ 
    -d \ 
    --rm \ 
    --network=test-network \ 
    --name test-{$GIT_COMMIT} \ 
    myapp:$GIT_COMMIT 

而一个容器来测试它实际上做了什么;

docker run --rm --network=test-network my-test-image curl test-{$GIT_COMMIT} 

一旦测试(和临时容器中取出),但是,您可以运行覆盖测试,而不是写在容器内覆盖报告,它写入卷或结合安装型。你可以用覆盖命令在docker run的容器中运行;

mkdir -p /coverage-reports/{$GIT_COMMIT} 
docker run \ 
    --rm \ 
    --name test-{$GIT_COMMIT}\ 
    -v /coverage-reports/{$GIT_COMMIT}:/usr/src/app/coverage \ 
    myapp:$GIT_COMMIT npm run test:cov 

上述命令;

  • 创建一个唯一的本地目录来存储测试工件(覆盖报告)
  • 运行你构建(和标签myapp:$GIT_COMMIT)在usr/src/app/coverage
  • 绑定贴装的/coverage-reports/{$GIT_COMMIT}到容器的图像运行覆盖率测试(如果我没有弄错的话,这将写入/usr/src/app/coverage--再次,不是节点专家)
  • 移除容器一旦退出

容器退出后,覆盖率报告存储在主机上的/coverage-reports/{$GIT_COMMIT}中。您可以使用常规工具rsync那些你想要的。

作为一种替代方案,您可以使用volume plugin将结果写入(例如)s3存储区,这样您就不必rsync结果。

一旦测试成功,您可以使用docker tag图像将您的应用程序的版本(例如docker tag myapp:1.0.12345),docker push添加到您的注册表中,并部署新版本。