我不是一個「節點」專家,所以在細節上多多包涵。
首先,您可以考慮是否需要單獨的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
添加到您的註冊表中,並部署新版本。