来自docker容器内的rsync文件?

时间:2017-03-31 19:11:49

标签: node.js docker jenkins dockerfile

我们正在使用Docker来构建/部署NodeJS应用程序。我们有一个由Jenkins构建的test容器,并执行我们的单元测试。 Dockerfile看起来像这样:

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

......哪个有效。好极了!

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

在Jenkins中,以这种方式调用上面的配置:

docker run -t test --rm

再次运行上述测试并存在容器。

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

2 个答案:

答案 0 :(得分:0)

创建一个脚本作为入口点执行并将命令放在脚本中。在调用docker run时传入args并将它们传递给脚本。

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

Docker Entrypoint Docs

答案 1 :(得分:0)

我不是&#34;节点&#34;专家,所以请耐心等待。

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

构建一个使用NodeJS应用程序作为基本映像(FROM my-nodejs-image)的测试图像可以解决这个问题,但如果您只需运行不同的命令就可能不需要图像上的em> / 入口点

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

让我先来看一下&#34;单独的Dockerfile&#34;点。我们说,你的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 .

成功构建图像后,您需要对其进行测试。可能是一个快速测试,以实际验证它&#34;运行&#34;。许多方法可以做到这一点,或许像是这​​样;

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
  • /coverage-reports/{$GIT_COMMIT}绑定到usr/src/app/coverage
  • 的容器中
  • 运行覆盖率测试(如果我没有弄错的话,会写入/usr/src/app/coverage - 再次,不是节点专家)
  • 一旦退出就移除容器

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

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

一旦测试成功,您可以docker tag图片将应用程序的版本(例如docker tag myapp:1.0.12345),docker push提升到您的注册表,然后部署新版本。