发明了新的料理,不来尝一下嘛
关于前言
关于前置知识
- 一点点 node
- 一点点 docker
- 一点点 git
关于本文的内容:
- 使用
Docker部署应用 - 使用
GitHub Action持续集成Node应用到Docker Hub内
请预先准备一个 node 的 hello world 的程序,node 官网有提供最简单的例子
关于 node 的 docker 镜像
docker 镜像化现有应用, 需要一个 dockerfile 与 .dockerignore,以下是例子内的 dockerfile
# 使用父镜像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 服务
可以使用以下 docker 指令来生成 http://localhost:6060 的服务
# 生成 docker imagedocker build -t na-example .# 运行 docker imagedocker 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推送镜像
GitHub Action 可以自己项目内 Action 项目内选择开源的 workflow 生成,选择 docker 的 workflow ,会在项目内生成 .github/workflows/docker.yml 文件,本项目是从 docker 的 workflow 衍生的
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解析以下这个文件
line 1-10:当推送代码至 main 分支或 tag 中有关键字 v 的时候,就会触发工作流
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
使用 Secrets 作为 env 变量,需要通过 GitHub 进行设置,项目内 Setting -> Secrets 进行创建即可
PS:比较优秀的事是,即便是相关字符串,在 GitHub Action 内也是 * 号显示的
关于遇到的问题
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 粘贴而来
感谢阅读