Docker'da çalışan bir Jenkins derleme bağımlısında npm önbelleği nasıl etkinleştirilir?


13

Bir Docker resmim var, diyelim frontend.imageki bir Jenkins yapı kölesi için kullanıyorum. Jenkins Docker eklentisi , bu görüntüden bir kap döndürür ve kap içinde yapay nesneler oluşturur. Tüm bunlar harika çalışıyor. Bu durumda, frontend.imagebir AngularJs uygulaması oluşturmak için kullanılır. Bu Açısal uygulamayı oluşturmanın bir parçası, uygulamanın gerektirdiği npm paketlerini yüklemektir.

Bu işlem, npm kurulum, uzun zaman alıyor gibi görünüyor, 3 dakika gibi görünüyor, npm her seferinde her paketi kurar.

Köle için bir birim ekledim, bu bir ana bilgisayara monte birimdir, Docker eklentisi, ön uç kapsayıcısını her çalıştırdığında bu birimi kullanacaktır:

resim açıklamasını buraya girin

Komutu yürütür kullanım npm installolup jenkins. npm npm config get cacheçıktı veren komut ile bulabileceğiniz bir önbellek tutar/home/jenkins/.npm

Bu yüzden /slaves/volumes/tsl.frontend:/home/jenkinsweb kapsayıcı slave'imde anasistem birimi var .

Angular uygulamamı bir Jenkins projesi kullanarak oluşturuyorum, sorun oluşturmuyor, birçok npm paketi kuruldu. Docker ana bilgisayarına ssh ve cmd çalıştırırsanız, ls /slaves/volumes/tsl.frontendçok sayıda npm paketi görüyorum. Bu, köle için ana bilgisayar birim bağlantımın çalıştığı anlamına gelir. resim açıklamasını buraya girin

Şimdi Jenkins projesini yeniden inşa ediyorum, Docker slave build container birim ana bilgisayar mount'unu kullanıyor olsa bile, npm her paketi tekrar kurar. Köle kabına cmd docker exec -it <some_clever_random_container_id> bashsonra cmd su jenkinssonra cmd npm cache lsile önbelleğe alınan birçok npm paketini listeleyerek teyit edebilirim. resim açıklamasını buraya girin

Bu nedenle, chmod 777izin sorunları olmadığı için bu arada izinleri olan ana bilgisayar bağlama birimimde bile npm install, önbelleği kullanamıyorum.

Docker slave konteynerini döndüren Jenkins derlememde, çalıştırdığım ilk cmd npm cache lsve birçok paket listeleniyor, bu, ana bilgisayar hacmimin beklendiği gibi çalıştığı ve npm önbellek dizininin bütünlüğü olduğu anlamına gelmiyor mu?

resim açıklamasını buraya girin

npm installLocalhost makinemde çalıştırdığımda tüm paketleri ilk kez yükleyen ve bir dahaki sefere neredeyse hiç paket olmayan normal cmd'yi denedim . Ve ayrıca bu SO yanıtı yanı sıra cmd npm --cache-min 9999999 installalınan npm önbellek "hack"npm --skip-installed --cache-min 9999999 install

İlgili bir soru StackOverflow'da yayınlanmıştır.


Açıklamanıza göre önbellek dizininin ~ / .npm içinde depolanmadığına bahse girerim
Tensibai

@Tensibai yanlış ve bu konuda çok eminim, kullanıcı jenkins, çünkü başka bir şekilde söylüyorum, çünkü nenk önbellek ls jenkins kullanıcı olarak çalıştırın ve paketleri listeler, npm yükleme olduğunu söylüyorsun başka bir kullanıcı tarafından idam ediliyor
Brian Ogden

hayır, ben endeks kendisi muhtemelen başka bir yerde, / usr / local veya npm yüklü veya whatelse yüklü ne olursa olsun saklıyorum, hiçbir fikrim yok. Bu sadece npm önbellekte hiçbir şey yokmuş gibi davranıyor gibi geliyor, bu yüzden sanırım dizini listelemek ama başka bir yerde dizin bir tür temel.
Tensibai

@Tensibai ama cmd npm config önbellek alır /home/jenkins.npm olarak bu yol önbellek konumunu onaylıyor sanmıyoruz?
Brian Ogden

Önbellek konumu evet, önbellek dizinini zorunlu kılmayan aynı konumdadır. Sadece derleme başlatırken kapsayıcı durumunu sağlamak için herhangi bir derleme adımından önce derleme betiğinde bir npm cache lsve bir ham eklemek istiyorum ls ~/.npm/* -al.
Tensibai

Yanıtlar:


5

Sonunda bu cevabı izleyerek npm yüklemesi için Docker görüntü katmanı önbellekleme kullanarak çözdüm

Bu, npm yüklemesini Docker slave görüntüsünün dışına ve aslında ön uç görüntüsüne taşıdığım anlamına gelir, burada package.config öğesinde herhangi bir değişiklik yoksa npm yüklemesini derlemeler arasında önbelleğe alan son Docker dosyam:

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

# /programming//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"]

2
sorularda açıklanan sorununuzu çözmez. Önbelleklemenin başka bir yolu. Sebebini henüz biliyor musun? @Brian
Bir Nguyen

@AnNguyen hayır, ve ben npm önbellek çalışmak için çalışırken çok zaman geçirdim. Çözümümü kullanmanızı öneririm
Brian Ogden

durumum farklı. Bir yapı her tetiklendiğinde k8'lere bir köle sağlanacaktır. Bu yüzden docker derleme işlemine dayalı önbellekleme yapamıyorum. NPM önbelleğine dayandırmak istiyorum, böylece her sağlandığında köle kalıcı bir birim bağlayabilirim
Bir Nguyen

0

Yapabileceğiniz başka bir yaklaşım, npm modüllerinizi barındıran ve harici olanları proxy kullanan bir nexus depo sunucusu kurmaktır. Önbellekten faydalanmaz, ancak kaynaklar yerel ağınız içinde veya belki aynı sürüde olduğundan uzun sürmemelidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.