關於前置知識node
關於本文的內容:git
Docker
部署應用GitHub Action
持續集成 Node
應用到 Docker Hub
內請預先準備一個 node 的 hello world 的程序,node 官網有提供最簡單的例子github
docker 鏡像化現有應用, 須要一個 dockerfile
與 .dockerignore
,如下是例子內的 dockerfile
docker
# 使用父鏡像 FROM node:current-slim # 設置工做目錄 WORKDIR /usr/src/app # 將文件從主機複製到當前位置 COPY package.json . # 影像文件中運行命令 RUN npm install # 描述容器運行時監聽的端口 EXPOSE 6060 # 在容器中運行的命令 CMD [ "npm", "start" ] # 將應用程序的其他源代碼從您的主機複製到映像文件系統 COPY . ./
該 dockerfile
複製了 package.json ,運行 npm install ,並啓動了端口號 6060 的 node 服務shell
可使用如下 docker 指令來生成 http://localhost:6060
的服務express
# 生成 docker image docker build -t na-example . # 運行 docker image docker run -dp 6060:6060 --name na-example na-example
大體指望的流程以下:npm
git push
最新代碼GitHub Action
開始運行docker build
最新代碼鏡像docker login
默認登錄 https://hub.docker.com/docker push
推送鏡像GitHub Action
能夠本身項目內 Action
項目內選擇開源的 workflow
生成,選擇 docker 的 workflow ,會在項目內生成 .github/workflows/docker.yml
文件,本項目是從 docker 的 workflow 衍生的json
name: Docker on: push: # Publish `main` as Docker `latest` image. branches: - main # Publish `v1.2.3` tags as releases. tags: - v* # Run tests for any PRs. pull_request: branches: - main env: IMAGE_NAME: na-example DOCKER_USERNAME: ${{secrets.DOCKER_USERNAME}} DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}} jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build image run: docker build -t $IMAGE_NAME . - name: Log into DockHub run: docker login -u ${{secrets.DOCKER_USERNAME}} -p ${{secrets.DOCKER_PASSWORD}} - name: Push image to DockHub run: | IMAGE_ID=$DOCKER_USERNAME/$IMAGE_NAME # 轉換成小寫 IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') # 從版本中刪除 github-ref Or github-sha 前綴 VERSION=$(echo "${{ github.sha }}" | sed -e 's,.*/\(.*\),\1,') # 從標籤名稱中刪除 v 前綴 # [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//') # Use Docker `latest` tag convention [ "${{ github.ref }}" == "main" ] && VERSION=latest # 保留前 7 位 VERSION=${VERSION:0:7} # 打印 IMAGE_ID echo IMAGE_ID=$IMAGE_ID # 打印 VERSION echo VERSION=$VERSION docker tag $IMAGE_NAME ${IMAGE_ID}:$VERSION docker push $IMAGE_ID:$VERSION
解析如下這個文件ubuntu
line 1-10
:當推送代碼至 main
分支或 tag
中有關鍵字 v
的時候,就會觸發工做流app
line 12-15
:工程流內拉取的分支便是 main
line 17-20
:定義工做流內的自定義環境變量
line 24
:runs-on
工做流的運行環境
line 26-27
:工做流步驟,以及工做流運行環境
line 28-32
:生成 docker
鏡像以及登錄 docker.hub
line 34-60
:運行 shell 腳本,條件定義 image
的 tag
,而後上傳至 docker.hub
使用 Secrets
做爲 env
變量,須要經過 GitHub
進行設置,項目內 Setting -> Secrets
進行建立便可
PS:比較優秀的事是,即使是相關字符串,在 GitHub Action 內也是 * 號顯示的
A:因爲 127.0.0.1 或 localhost 是指向鏡像內的 IP,非對外 IP,若是須要對外訪問,可把啓動 IP 修改位 0.0.0.0
A:可參考 Context and expression syntax for GitHub Actions 與 environment-variables
本文項目全部代碼均從 na-example 粘貼而來
感謝閱讀