关于前言
关于前置知识
- 一点点 node
- 一点点 docker
- 一点点 git
关于本文的内容:
- 使用
Docker 部署应用 - 使用
GitHub Action 持续集成Node 应用到Docker Hub 内
请预先准备一个 node 的 hello world 的程序,node 官网有提供最简单的例子
关于 node 的 docker 镜像
docker 镜像化现有应用, 需要一个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 使用父镜像 FROM node:current-slim # 设置工作目录 WORKDIR /usr/src/app # 将文件从主机复制到当前位置 COPY package.json . # 影像文件中运行命令 RUN npm install # 描述容器运行时监听的端口 EXPOSE 6060 # 在容器中运行的命令 CMD [ "npm", "start" ] # 将应用程序的其余源代码从您的主机复制到映像文件系统 COPY . ./ |
该
可以使用以下 docker 指令来生成
1 2 3 4 | # 生成 docker image docker build -t na-example . # 运行 docker image docker run -dp 6060:6060 --name na-example na-example |
关于 Github Action 自动化的流程
大致期望的流程如下:
git push 最新代码GitHub Action 开始运行docker build 最新代码镜像docker login 默认登陆 https://hub.docker.com/docker push 推送镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | 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 |
解析以下这个文件
Secrets
使用
关于遇到的问题
Q:关于 node 项目使用 127.0.0.1 或 localhost 作为启动 IP 生成 docker image 化后,运行后无法访问
A:由于 127.0.0.1 或 localhost 是指向镜像内的 IP,非对外 IP,如果需要对外访问,可把启动 IP 修改位 0.0.0.0
Q:关于 GitHub Action 默认的环境变量
A:可参考 Context and expression syntax for GitHub Actions 与 environment-variables
关于小结
本文项目所有代码均从 na-example 粘贴而来
感谢阅读
关于参考
- How to CI and CD a Node.JS Application Using GitHub Actions
- GitHub Action
- docker docs