2017-01-05 35 views
11

Tôi đã tạo ứng dụng Angular2 mới bằng angular-cli và chạy nó trong Docker.Cách thu nhỏ kích thước hình ảnh Docker với NodeJs

Lúc đầu, tôi init ứng dụng trên máy tính địa phương của tôi:

ng new project && cd project && "put my Dockerfile there" && docker build -t my-ui && docker run. 

My Dockerfile

FROM node 

RUN npm install -g [email protected] && npm cache clean && rm -rf ~/.npm 

RUN mkdir -p /opt/client-ui/src 
WORKDIR /opt/client-ui 

COPY package.json /opt/client-ui/ 
COPY angular-cli.json /opt/client-ui/ 
COPY tslint.json /opt/client-ui/ 

ADD src/ /opt/client-ui/src 

RUN npm install 
RUN ng build --prod --aot 

EXPOSE 4200 

ENV PATH="$PATH:/usr/local/bin/"  
CMD ["npm", "start"] 

Mọi thứ đều OK, vấn đề là kích thước của hình ảnh: 939MB !!! Tôi đã cố gắng sử dụng FROM: ubuntu: 16.04 và cài đặt NodeJ trên nó (nó hoạt động), nhưng hình ảnh của tôi vẫn có ~ 450 MB. Tôi biết rằng nút: alpine tồn tại, nhưng tôi không thể cài đặt angular-cli trong đó.

Làm cách nào để thu nhỏ kích thước hình ảnh? Có cần thiết để chạy "npm install" và "ng build" trong Dockerfile không? Tôi hy vọng sẽ xây dựng ứng dụng trên localhost và sao chép nó vào hình ảnh. Tôi đã cố gắng để sao chép dist dir và và file package.json vv, nhưng nó không hoạt động (ứng dụng bắt đầu thất bại). Cảm ơn.

+1

nơi sử dụng không gian đến từ đâu? 'du -h' – Sebas

+1

Sử dụng' lịch sử docker 'để hiển thị tất cả các lớp của hình ảnh để tìm nơi không gian được sử dụng. – nwinkler

Trả lời

0

Để sản xuất, bạn không cần phân phối hình ảnh với Node.js, phụ thuộc NPM, v.v. Bạn chỉ cần một hình ảnh có thể được sử dụng để bắt đầu vùng chứa dữ liệu cung cấp các nguồn đã biên dịch, phát hành bản đồ nguồn và các tài sản khác, hiệu quả không nhiều hơn những gì bạn sẽ phân phối lại với một gói thông qua NPM, mà bạn có thể đính kèm vào máy chủ web của bạn. Vì vậy, đối với máy chủ CI, bạn có thể chọn một trong số các phân phối node:alpine và sao chép nguồn và cài đặt các phụ thuộc trong đó, sau đó bạn có thể sử dụng lại hình ảnh này để chạy các thùng chứa thử nghiệm các bản dựng cho đến khi cuối cùng bạn chạy một vùng chứa thực hiện một trình biên dịch sản xuất, mà bạn có thể đặt tên.

docker run --name=compile-${RELEASE} ci-${RELEASE} npm run production 

Sau khi bạn đã hoàn thành việc biên soạn các nguồn bên trong một container, chạy một container có khối lượng từ container biên soạn kèm theo và sao chép các nguồn để một khối lượng trên thùng và đẩy đến Docker bạn ngược dòng:

docker run --name=release-${RELEASE} --volumes-from=compile-${RELEASE} -v /srv/public busybox cp -R /myapp/dist /srv/public 
docker commit release-${RELEASE} release-${RELEASE} myapp:${RELEASE} 
0

Hãy thử FROM mhart/alpine-node:base-6 có thể nó sẽ hoạt động.

Các vấn đề liên quan