Docker

Jenkins Docker 建構奴隸 - npm 記憶體不起作用

  • December 21, 2017

我有一個 Docker 映像,我們稱之為frontend.imageJenkins 建構從站。Jenkins Docker 外掛將從這個鏡像啟動一個容器並在容器內建構工件。這一切都很好。在這種情況下,frontend.image用於建構 AngularJs 應用程序。建構這個 Angular 應用程序的一部分是安裝應用程序所需的 npm 包。

這個過程,npm install,好像要花很長時間,好像3分鐘,npm每次總是安裝每一個包。

所以我為我的從伺服器添加了一個卷,它是一個主機掛載的捲,Docker 外掛每次執行前端容器時都會使用這個卷:

在此處輸入圖像描述

執行命令的使用者npm installjenkins。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 從建構容器正在使用卷主機掛載。我什至可以通過使用 cmddocker exec -it <some_clever_random_container_id> bash然後 cmdsu jenkins然後 cmd進入從容器來確認,npm cache ls其中列出了許多記憶體的 npm 包。 在此處輸入圖像描述

因此,即使使用我的主機掛載卷,chmod 777順便說一下,它具有權限,因此沒有權限問題,我也無法npm install使用記憶體。

我已經嘗試過正常的npm installcmd,當我在我的 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"]

引用自:https://serverfault.com/questions/880465