- Published on
8 bước để xây Dockerfile trên môi trường production
- Authors
- Name
- Nguyễn Văn Quang
- @_nguyenvanquang
8 bước để xây Dockerfile trên môi trường production
Sử dụng các docker images đã được kiểm chứng trên docker hub(official images), không nên cố gắng dựng nên các images từ đầu, nếu không cần thiết. Vì như vậy, sẽ tăng tính rủi ro bảo mật, đồng thời tăng kích thước của docker image, ...
- Không nên:
FROM ubuntu RUN apt-get update && apt-get install -y \ node \ && rm -rf /var/lib/apt/lists/*
- Nên:
FROM node
Chỉđịnh version cụ thể cho các docker images để tránh các thay đổi không mong muốn ở latest version.
- Không nên:
FROM node
- Nên:
FROM node:17.0.1
Sử dụng docker images có kích thước nhỏ nhất có thể. Có nhiều images cho nhiều hệ điều hành khác nhau, chứa những thư viện có thể không cần thiết cho ứng dụng của bạn, điều này làm tăng thời gian download/upload images, đồng thời làm tăng rủi ro bảo mật. Thông thường nên dùng images build cho hệ điều hành alpine để giảm kích thước.
- Không nên:
FROM node:17.0.1
- Nên:
FROM node:17.0.1-alpine
Tận dụng tối đa caching trong quá trình build images. Cố gắng đưa các các layers có nhiều thay đổi về cuối file Dockerfile, theo trình tự từ trên xuống dưới.
- Không nên:
FROM node:17.0.1-alpine WORKDIR /app COPY package.json package-log.json . COPY myapp /app RUN npm install --production CMD ["node", "src/server.ts"]
- Nên:
FROM node:17.0.1-alpine WORKDIR /app COPY package.json package-log.json . RUN npm install --production COPY myapp /app CMD ["node", "src/server.ts"]
Sử dụng .dockerignore file, để tránh copy những files không cần thiết vào trong image. Dưới dây là một ví dụ:
.dockerignore
.git .cache *.md private.key settings.json
Chia quá trình build image thành hai phần: build stage và run stage. Điều này có dụng làm giảm kích thước images ở môi trường product. Trong quá trình build docker image, có thể chỉ định build ở stage cụ thể, ví dụ ở môi trường development thì chỉ cần build ở stage-build còn ở môi trường production thì ở stage-production.
# Build stage FROM node:17.0.1-alpine AS build WORKDIR /app COPY package.json package-log.json . npm install --production COPY myapp /app CMD ["node", "src/server.ts"] # Production FROM node:17.0.1-alpine WORKDIR /app COPY /app . CMD ["node", "src/server.ts"] EXPOSE 4000
Không chạy ứng dụng bằng quyền root, nếu không chỉ rõ user thì mặc định là root. Điều này làm tăng rũi ro bảo mật, hacker có thể dựa tận dụng lỗ hỗng trong ứng dụng để tấn công docker host.
... # create group and user RUN groupadd -r app && useradd -g app app # set ownership and permissions RUN chown -R app:app /app # switch to user app USER app CMD ["node", "server.ts"]
Tuy nhiên một số images đã có sẵn các user dùng cho việc chạy ứng dụng, ví dụ đối với image node đã có sẵn user node:
FROM node:10-alpine ... # set ownership and permissions RUN chown -R node:node /app # switch to node user USER node CMD ["node", "server.ts"]
Sử dụng docker scan để tìm kiếm các lỗ hỗng bảo mật, hoặc sử dụng công cụ scan trên docker hub.
$ docker scan hello-nodejs