Hướng dẫn gitlab ci cd nodejs docker - docker gitlab ci cd nodejs

Xuất bản ngày 8 tháng 4 năm 2021

Một người bạn đề nghị tôi bắt đầu với Dockerize, các ứng dụng của tôi để quản lý dễ dàng. Anh ấy đã thuyết phục tôi rằng việc container hóa là con đường của tương lai, và sau một chút nghiên cứu, tôi nhận ra anh ấy đã đúng!

Cuối cùng tôi đã giải quyết được một quy trình để chứa các ứng dụng NodeJS và định cấu hình triển khai tự động thông qua Gitlab CI. Tôi nghĩ sẽ hữu ích để chia sẻ những gì tôi đã học được khi nó có thể giúp đỡ người khác.

Tổng quan

Bài đăng này đi qua mã trong một dự án mẫu mà tôi đã tạo bao gồm một số bước cơ bản:

  1. Tạo API REST NODEJS đơn giản và chứa nó thành hình ảnh docker.
  2. Chuẩn bị một máy chủ dàn (Ubuntu) để hỗ trợ triển khai hình ảnh Docker qua SSH.
  3. Định cấu hình một dự án Gitlab với đường ống CI tự động xây dựng và triển khai hình ảnh Docker mới mỗi khi cam kết mã được đẩy.

Sau khi được triển khai đến máy chủ sắp xếp, API RESTS NODEJS có thể truy cập thông qua proxy ngược của Apache Web.

Đường ống CI được bắt đầu bởi các cam kết mã được hiển thị trong đỉnh bên trái; Sau khi được triển khai, người dùng có thể truy cập ứng dụng Docker qua Apache (được hiển thị ở phía dưới bên phải)

Mã mẫu được đăng lên GitHub

Dự án tương tự được đề cập trong bài đăng này đã được đăng lên GitHub và có sẵn ở đây. Mã nên sẵn sàng để đi và có thể được sử dụng bằng cách làm theo các hướng dẫn trong README.md.

Giả định

Hướng dẫn này giả định quyền truy cập vào một phiên bản Gitlab đang hoạt động, với CI và người chạy được cấu hình, và cũng là một sổ đăng ký container docker để đẩy và kéo hình ảnh docker (đây có thể là một sổ đăng ký được lưu trữ riêng của Gitlab, Docker Hub hoặc bất kỳ sổ đăng ký nào khác). 2 bước đầu tiên trong hướng dẫn DigitalOcean này có thể giúp định cấu hình các thành phần Gitlab nếu cần. Tôi khuyên bạn nên kiểm tra hướng dẫn DigitalOcean nói chung, vì nó rất giống với những gì được đề cập trong bài đăng này.

1. dockerizing Ứng dụng NodeJS

Dự án mẫu chứa API NodeJS REST cơ bản được tạo với Trình tạo ứng dụng Express. Để chạy API cục bộ, hãy khởi chạy nó với npm start và thực hiện yêu cầu nhận đến //localhost:3000/info. API sẽ tạo phản hồi JSON tương tự như:

{ "name": "node-docker-gitlab-ci", "server": "express", "variableData": "NodeJS Code" }

Bây giờ, API RESTS của NodeJS đang hoạt động, bước tiếp theo là tạo Dockerfile và xác định cách Docker sẽ đóng gói API thành một hình ảnh. Tôi đã sử dụng Dockerfile trong hướng dẫn DigitalOcean này làm điểm khởi đầu và điều chỉnh nó một chút:

FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]

Mặc dù thẳng, mọi thứ có thể trở nên phức tạp hơn nếu ứng dụng yêu cầu các khóa hoặc biến để truyền vào hình ảnh. Một ví dụ về các cách khác nhau để làm điều này được thảo luận ở cuối bài này.

2. Chuẩn bị máy chủ dàn

Tiếp theo, chúng tôi sẽ chuẩn bị máy chủ dàn để chấp nhận triển khai qua SSH. Trong ví dụ này, chúng tôi đang triển khai theo ví dụ Debian/Ubuntu. Chúng ta sẽ cần:

  • Tạo người dùng Linux mới và thêm nó vào nhóm FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]1 (để nó có quyền truy cập vào lệnh FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]1).
  • Tạo khóa SSH cho người dùng.
  • Định cấu hình Apache thành các yêu cầu Web proxy trở lại container Docker, sau khi được triển khai.

Như được mô tả trong Hướng dẫn DigitalOcean này, chúng tôi sẽ tạo một người dùng mới và nó cho nhóm FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]1:

sudo adduser deployer sudo usermod -aG docker deployer

Tiếp theo chúng tôi sẽ tạo một khóa SSH cho người dùng. Khóa này sau đó sẽ được thêm vào Gitlab để đường ống Gitlab CI có thể đăng nhập vào máy chủ dàn vì người dùng này để triển khai.

# recommended to su into the user to simplify housekeeping su deployer ssh-keygen -b 4096 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

Lưu ý: Chúng tôi sẽ cần khóa riêng được tạo ở đây trong Phần 4 dưới đây. Trừ khi có quy định khác, giá trị này được ghi lại trong FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]4. we will need the private key generated here in section 4 below. Unless otherwise specified, this value is captured in FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]4.

Khi người dùng Linux được thiết lập, chúng tôi sẽ định cấu hình máy chủ Web Apache thành các yêu cầu proxy trở lại container Docker. Tùy thuộc vào thiết lập hiện tại, tùy chọn đơn giản nhất có thể là xác định proxy ngược bên trong một vhost hiện có:

# define reverse proxy ProxyPass /info //127.0.0.1:8882/info ProxyPassReverse /info //127.0.0.1:8882/info # optional headers - can be omitted <LocationMatch /info> # enable CORS Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "GET" # do not cache Header set Cache-Control "no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires "0" </LocationMatch>

Các yêu cầu thông báo cho tuyến đường FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]5 được ủy quyền cho container Docker, sẽ nghe trên cổng FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]6. Cổng này sẽ được đặt trong lệnh FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]7, được thực thi trong FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]8 (được đề cập trong Phần 4 bên dưới). Các chỉ thị CORS và bộ đệm là tùy chọn, và chỉ bao gồm trong trường hợp.

Lưu ý: Đảm bảo các mô -đun Apache cần thiết được bật để hỗ trợ proxy ngược - xem bài đăng này để biết chi tiết. ensure the required Apache modules are enabled to support reverse proxying – see this post for details.

3. Cấu hình Gitlab

Tiếp theo, chúng tôi sẽ định cấu hình Gitlab để hỗ trợ các bản dựng và triển khai CI mỗi lần cam kết. Dưới đây là một vài điều bên trong Gitlab phải được cấu hình trước:

  • Chúng tôi sẽ cần một dự án Gitlab để chứa mã - trong ví dụ này, chúng tôi sử dụng một dự án có tên FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]9.
  • Gitlab phải có ít nhất một người chạy được cấu hình - thêm thông tin có sẵn ở đây.
  • Dự án Gitlab phải cho phép người chạy trong phần Cài đặt> CI/CD> Runners.

Khi các bước này được hoàn thành, các đường ống dự án sẽ có thể xem được từ trong menu đường ống CI/CD> dự án.

Có sẵn từ trang PIPELINES NODE-DOCKER-GITLAB-CI

Định cấu hình các biến Gitlab CI/CD

Phần tiếp theo của cấu hình Gitlab liên quan đến việc thiết lập các biến CI/CD cho dự án FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]9. Sau khi được đặt, các biến này có thể được đọc từ trong tệp FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]8 và tạo một nơi tuyệt vời để lưu trữ các khóa hoặc thông tin nhạy cảm khác.

Bên trong phần Cài đặt dự án> CI/CD> Biến, chúng ta cần tạo 3 biến:

  1. sudo adduser deployer sudo usermod -aG docker deployer2 - Chứa địa chỉ IP của máy chủ dàn được định cấu hình trong Phần 2. Đây là địa chỉ IP được sử dụng để tạo kết nối SSH từ người chạy Gitlab.
  2. sudo adduser deployer sudo usermod -aG docker deployer3 - Chứa tên người dùng trên máy chủ dàn, nếu làm theo hướng dẫn này là sudo adduser deployer sudo usermod -aG docker deployer4.
  3. sudo adduser deployer sudo usermod -aG docker deployer5 - Chứa khóa riêng của SSH cho người dùng sudo adduser deployer sudo usermod -aG docker deployer4 trong Phần 2. Khóa này có thể được tìm thấy trong FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]4. Khi nhập giá trị này vào gitlab, hãy đảm bảo loại được đặt thành tệp tệp và một dòng mới được tạo sau sudo adduser deployer sudo usermod -aG docker deployer8 ở phía dưới.

Có sẵn trong các cài đặt dự án Node-Docker-Gitlab-CI> CI/CD> Trang biến

4. Kích hoạt bản dựng CI

Phần chính cuối cùng của cấu hình này liên quan đến việc thiết lập Gitlab CI/CD. Điều này được thực hiện bằng cách thêm một tệp FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]8 vào gốc của dự án FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]9. Trong dự án mẫu, một dự án đã được cung cấp giống như:

stages: - build - deploy-stage variables: VARIABLE_DATA: Gitlab-CI-YAML build: stage: build image: docker:18-git services: - docker:18-dind script: # get node app version from package.json for use in tagging docker image - apk update && apk add jq - export VERSION=`jq -r ".version" < ./package.json` # login to docker - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY # build and tag docker image - docker build -t $CI_REGISTRY_IMAGE:$VERSION -t $CI_REGISTRY_IMAGE:latest . # publish finished image - docker push $CI_REGISTRY_IMAGE:$VERSION - docker push $CI_REGISTRY_IMAGE:latest deploy-stage: stage: deploy-stage image: alpine:latest script: - chmod og= $STAGE_ID_RSA - apk update && apk add openssh-client # stop existing docker container & remove images - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker stop $CI_PROJECT_NAME || true" - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker rm $CI_PROJECT_NAME || true" - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker image rm $CI_REGISTRY_IMAGE:latest || true" # pull new container - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY" - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker pull $CI_REGISTRY_IMAGE:latest" # run new container - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker run -d --restart unless-stopped --name $CI_PROJECT_NAME -p 8882:3000 -e "variableData=Docker-Run-Command" $CI_REGISTRY_IMAGE:latest"

Có nhiều tài nguyên tuyệt vời mô tả cú pháp CI YAML của Gitlab. Như chúng ta có thể thấy, quy trình xây dựng CI này có 2 giai đoạn, # recommended to su into the user to simplify housekeeping su deployer ssh-keygen -b 4096 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys1 và # recommended to su into the user to simplify housekeeping su deployer ssh-keygen -b 4096 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys2. Giai đoạn # recommended to su into the user to simplify housekeeping su deployer ssh-keygen -b 4096 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys1 chạy lệnh # recommended to su into the user to simplify housekeeping su deployer ssh-keygen -b 4096 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys4, thực hiện các bước được xác định trong Dockerfile để xây dựng hình ảnh Docker và đẩy nó vào sổ đăng ký container docker được cấu hình (được lưu trữ bởi Gitlab trong ví dụ này).

Giai đoạn # recommended to su into the user to simplify housekeeping su deployer ssh-keygen -b 4096 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys2 có liên quan nhiều hơn một chút và sử dụng tất cả các biến GITLAB CI/CD được xác định trong Phần 3 ở trên (lưu ý sudo adduser deployer sudo usermod -aG docker deployer5, sudo adduser deployer sudo usermod -aG docker deployer3 và sudo adduser deployer sudo usermod -aG docker deployer2). Giai đoạn này sẽ tạo một phiên SSH vào máy chủ dàn, sử dụng khóa SSH của người dùng sudo adduser deployer sudo usermod -aG docker deployer4. Trong khi trên máy chủ dàn, sau đó nó sẽ kéo xuống hình ảnh Docker mới được xây dựng và cài đặt nó vào thời gian chạy Docker địa phương.

Cuối cùng, dòng cuối cùng của tệp YAML phát hành lệnh FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]7, sẽ bắt đầu container Docker, xác định các cổng mạng và truyền trong bất kỳ biến môi trường nào được sử dụng bên trong hình ảnh.

Khi tệp FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]8 cam kết với repo, nó sẽ tắt các cuộc đua!

Có lẽ chỉ thú vị cho DevOps mọt sách ..

Lưu trữ các khóa và biến ở đâu

Một vấn đề có thể xuất hiện khi xác định các bản dựng CI/CD là nơi xác định các khóa, mật khẩu và thông tin nhạy cảm khác. Đặc biệt là khi đối phó với Docker, phải cẩn thận để đảm bảo các khóa truy cập không được nướng vào hình ảnh docker trong quá trình xây dựng.

Trong Phần 3 ở trên, chúng tôi đã xác định các khóa máy chủ của chúng tôi trong các biến CI/CD của Dự án Gitlab. Mặc dù điều này hoạt động tốt, chúng tôi cũng có thể lưu trữ thông tin này trong tệp FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]8, Dockerfile hoặc thậm chí trong chính mã NodeJS. Mặc dù các biến "mã hóa cứng" hơn một chút khi được xác định trong các tệp này, nhưng nó có thể hữu ích cho các mục ít nhạy hơn và hiếm khi thay đổi (ví dụ: ID cặp khóa AWS).

Dưới đây là các ví dụ về việc xác định giá trị # define reverse proxy ProxyPass /info //127.0.0.1:8882/info ProxyPassReverse /info //127.0.0.1:8882/info # optional headers - can be omitted <LocationMatch /info> # enable CORS Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "GET" # do not cache Header set Cache-Control "no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires "0" </LocationMatch>5 từ phản hồi API NodeJS REST trong các tập lệnh xây dựng CI/CD khác nhau (và sau đó đọc nó từ tệp FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]8):

  • Được xác định trong lệnh FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]7 trong giá trị FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]8 - cam kết - được mã hóa cứng và được chuyển vào thùng chứa Docker dưới dạng biến môi trường (sau đó được đọc bởi ứng dụng NodeJS).
  • Được xác định trong giá trị Dockerfile - cam kết được ghi vào tệp stages: - build - deploy-stage variables: VARIABLE_DATA: Gitlab-CI-YAML build: stage: build image: docker:18-git services: - docker:18-dind script: # get node app version from package.json for use in tagging docker image - apk update && apk add jq - export VERSION=`jq -r ".version" < ./package.json` # login to docker - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY # build and tag docker image - docker build -t $CI_REGISTRY_IMAGE:$VERSION -t $CI_REGISTRY_IMAGE:latest . # publish finished image - docker push $CI_REGISTRY_IMAGE:$VERSION - docker push $CI_REGISTRY_IMAGE:latest deploy-stage: stage: deploy-stage image: alpine:latest script: - chmod og= $STAGE_ID_RSA - apk update && apk add openssh-client # stop existing docker container & remove images - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker stop $CI_PROJECT_NAME || true" - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker rm $CI_PROJECT_NAME || true" - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker image rm $CI_REGISTRY_IMAGE:latest || true" # pull new container - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY" - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker pull $CI_REGISTRY_IMAGE:latest" # run new container - ssh -i $STAGE_ID_RSA -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker run -d --restart unless-stopped --name $CI_PROJECT_NAME -p 8882:3000 -e "variableData=Docker-Run-Command" $CI_REGISTRY_IMAGE:latest" 0 được tạo trong quá trình xây dựng hình ảnh Docker, sau đó được đọc bởi ứng dụng NodeJS.
  • Được xác định trong chính mã NodeJS - cam kết A và cam kết B - xóa định nghĩa # define reverse proxy ProxyPass /info //127.0.0.1:8882/info ProxyPassReverse /info //127.0.0.1:8882/info # optional headers - can be omitted <LocationMatch /info> # enable CORS Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "GET" # do not cache Header set Cache-Control "no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires "0" </LocationMatch>5 khỏi cả lệnh FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]7 và Dockerfile có nghĩa là giá trị mặc định được đặt trong mã NodeJS sẽ được trả về.

Cải tiến

Mặc dù cách tiếp cận này đã hoạt động tốt cho một vài dự án khác nhau, cuối cùng tôi muốn tránh xa việc mở quyền truy cập SSH trên máy chủ của mình, đặc biệt là cho người dùng trong nhóm FROM node:14-alpine # create dir RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app # build dependencies COPY ./package*.json ./ USER node RUN npm install # copy in source code COPY --chown=node:node ./ ./ # start express server CMD [ "npm", "start" ]1 (gần với quyền root). Tôi đã cố gắng giảm thiểu điều này bằng cách kết hợp một số thực tiễn tốt nhất SSH (ví dụ: thay đổi cổng mặc định, chỉ cho phép một số địa chỉ IP nhất định kết nối, các khóa xoay, v.v.). Tôi sẽ tiếp tục xem xét các triển khai từ xa với Docker với hy vọng tìm thấy thứ gì đó cảm thấy an toàn hơn!

Tôi có thể chạy Gitlab trong Docker không?

Cài đặt Gitlab làm bộ chứa Docker để Gitlab sẽ chạy bên trong thùng chứa Docker, nhưng nó sẽ sử dụng đĩa của máy chủ để lưu dữ liệu và tải cấu hình.Lộ các cổng 443, 80, 22 và ánh xạ chúng vào cùng một cổng vào máy chủ./srv/gitlab/dữ liệu sẽ giữ dữ liệu của git repo thực tế.GitLab will run inside a docker container, but it will use the host machine's disk to save data and load configurations. Expose the ports 443, 80, 22, and map them to the same ports to the host machine. /srv/gitlab/data will hold the actual git repo's data.

Gitlab có hỗ trợ CI CD không?

Gitlab có CI/CD được xây dựng ngay, không cần plugin., no plugins required.

Hình ảnh Docker trong Gitlab CI là gì?

Gitlab CI kết hợp với Gitlab Runner có thể sử dụng Công cụ Docker để kiểm tra và xây dựng bất kỳ ứng dụng nào.Docker là một dự án nguồn mở cho phép bạn sử dụng hình ảnh được xác định trước để chạy các ứng dụng trong các "container" độc lập được chạy trong một thể hiện Linux duy nhất.an open-source project that allows you to use predefined images to run applications in independent "containers" that are run within a single Linux instance.

CI CD có miễn phí trên gitlab không?

Nếu bạn có một dự án công khai, nguồn mở trên GitHub, giờ đây bạn có thể tận dụng CI/CD miễn phí trên gitlab.com.Là một phần trong cam kết của chúng tôi đối với nguồn mở, chúng tôi cung cấp tất cả các dự án công cộng các tính năng cấp cao nhất của chúng tôi (Gitlab SaaS Ultimate) miễn phí.. As part of our commitment to open source, we offer all public projects our highest tier features (GitLab SaaS Ultimate) for free.

Chủ đề