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-image
) FROM 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,并部署新版本。