关于前置知识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 粘贴而来
感谢阅读