docker集装箱内的rsync文件?

我们使用Docker来构build/部署NodeJS应用程序。 我们有一个由Jenkins构build的test容器,并执行我们的unit testing。 Dockerfile看起来像这样:

 FROM node:boron # <snip> some misc unimportant config here # Run the tests ENTRYPOINT npm test 

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

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

…工作。 好极了!

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

在jenkins,上面的configuration是这样调用的:

 docker run -t test --rm 

其中,再次运行上述testing并存在容器。

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

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

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

Docker入口文档

我不是一个“节点”的专家,所以请耐心等待细节。

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

构build一个使用NodeJS应用程序作为基本映像( FROM my-nodejs-imageFROM my-nodejs-image可以实现这个function,但如果您只需要在映像上运行不同的命令 / 入口点 ,则可能不需要。

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

让我从“单独的Dockerfile”开始。 比方说,你的Dockerfile应用程序Dockerfile看起来像这样;

 FROM node:boron COPY package.json /usr/src/app/ RUN npm install && npm cache clean COPY . /usr/src/app CMD [ "npm", "start" ] 

你build立你的图像,并标记它,例如,它的build立提交;

 docker build -t myapp:$GIT_COMMIT . 

一旦图像被成功build立,你想要testing它。 可能是一个快速的testing来validation它实际上“运行”。 有很多方法可以做到这一点,

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

而一个容器来testing它实际上做了一些事情;

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

一旦testing完毕(以及临时容器被移除),您可以运行覆盖率testing,而不是在容器内写入覆盖率报告,将其写入容量或绑定安装。 你可以用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 

上面的命令;

  • 创build一个唯一的本地目录来存储testing工件(覆盖率报告)
  • 运行您build立的图像(并标记myapp:$GIT_COMMIT
  • /coverage-reports/{$GIT_COMMIT}绑定到usr/src/app/coverage的容器中
  • 运行覆盖testing(如果我没有弄错的话,它会写入到/usr/src/app/coverage – 再次,不是Node专家)
  • 卸下容器后,它退出

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

作为替代scheme,您可以使用音量插件将结果写入(例如) s3存储桶,这样可以避免您必须rsync结果。

一旦testing成功,您可以通过docker tag图像来docker tag myapp:1.0.12345您的应用程序的版本(例如, docker tag myapp:1.0.12345 ), docker tag myapp:1.0.12345 docker push送到您的registry,并部署新版本。