Jenkins Docker 建構奴隸 - npm 記憶體不起作用
我有一個 Docker 映像,我們稱之為
frontend.image
Jenkins 建構從站。Jenkins Docker 外掛將從這個鏡像啟動一個容器並在容器內建構工件。這一切都很好。在這種情況下,frontend.image
用於建構 AngularJs 應用程序。建構這個 Angular 應用程序的一部分是安裝應用程序所需的 npm 包。這個過程,npm install,好像要花很長時間,好像3分鐘,npm每次總是安裝每一個包。
所以我為我的從伺服器添加了一個卷,它是一個主機掛載的捲,Docker 外掛每次執行前端容器時都會使用這個卷:
執行命令的使用者
npm install
是jenkins
。npm 保留一個記憶體,您可以使用npm config get cache
輸出的命令找到該記憶體/home/jenkins/.npm
這就是我將主機捲
/slaves/volumes/tsl.frontend:/home/jenkins
安裝到我的 Web 容器從屬設備的原因。我使用 Jenkins 項目建構我的 Angular 應用程序,建構沒有問題,安裝了許多 npm 包。如果 ssh 進入我的 Docker 主機並執行 cmd
ls /slaves/volumes/tsl.frontend
,我會看到很多 npm 包。這意味著我的從屬主機捲掛載工作正常。現在我再次建構 Jenkins 項目,npm 再次安裝每個包,即使 Docker 從建構容器正在使用卷主機掛載。我什至可以通過使用 cmd
docker exec -it <some_clever_random_container_id> bash
然後 cmdsu jenkins
然後 cmd進入從容器來確認,npm cache ls
其中列出了許多記憶體的 npm 包。因此,即使使用我的主機掛載卷,
chmod 777
順便說一下,它具有權限,因此沒有權限問題,我也無法npm install
使用記憶體。我已經嘗試過正常的
npm install
cmd,當我在我的 localhost 機器上執行時,它會第一次安裝所有的包,而下一次幾乎沒有包。還有 npm cache “hack”npm --cache-min 9999999 install
,取自這個 SO 答案以及 cmdnpm --skip-installed --cache-min 9999999 install
我終於解決了這個問題,通過使用 Docker 鏡像層記憶體進行 npm 安裝,遵循這個答案
這意味著我將 npm install 從 Docker 從映像移到實際的前端映像中,這是我的最終 Docker 文件,如果 package.config 沒有更改,則它真正記憶體了建構之間的 npm install:
FROM centos:7 MAINTAINER Brian Ogden # Not currently being used but may come in handy ARG ENVIRONMENT ENV NODE_VERSION 6.11.1 RUN yum -y update && \ yum clean all && \ yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \ yum -y makecache && \ yum -y install nginx-1.12.0 wget # Cleanup some default NGINX configuration files we don’t need RUN rm /etc/nginx/conf.d/default.conf ############################################# # NodeJs Install ############################################# #Download NodeJs package RUN wget -q -O - https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz \ | tar --strip-components=1 -xzf - -C /usr/local # https://stackoverflow.com/a/35774741/1258525 # use changes to package.json to force Docker not to use the cache # when we change our application's nodejs dependencies: COPY ./package.json /tmp/package.json RUN cd /tmp && npm install RUN mkdir /app && cp -a /tmp/node_modules /app/ WORKDIR /app COPY . /app RUN npm run build-$ENVIRONMENT RUN cd /app && cp -a dist/* /usr/share/nginx/html COPY ./docker/conf/frontend.conf /etc/nginx/conf.d/frontend.conf COPY ./docker/conf/nginx.conf /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx"]