我们正在使用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将某些结果发送到远程服务器?
答案 0 :(得分:0)
创建一个脚本作为入口点执行并将命令放在脚本中。在调用docker run
时传入args并将它们传递给脚本。
文档中有一个postgres图像脚本的示例。你可以建立起来。
答案 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
提升到您的注册表,然后部署新版本。