Github 用于构建 SQL 服务器容器的 CICD 操作失败但可以在本地运行

Github Actions CICD to build a SQL Server container fails but will work Locally

我开始着手 Github 操作来构建一些示例容器,而不是在本地进行构建。减少对我的机器等的依赖。似乎虽然构建和推动我的 MAC 有效,但创建一个 Action 来完成它会失败。

在本地进行测试时,我确实确保我有一个更新的 Dockerfile 以确保所有内容都根据需要正确构建,但我的一部分认为它与 OS 构建有关 Github 动作,但我正在尝试更多地理解它。

我得到的错误是:

Error: failed to solve: executor failed running [/bin/sh -c ( /opt/mssql/bin/sqlservr & ) | grep -q "Service Broker manager has started" && /opt/sqlpackage/sqlpackage /a:Import /tsn:. /tdn:${DBNAME} /tu:sa /tp:$SA_PASSWORD /sf:/tmp/db.bacpac && rm /tmp/db.bacpac && pkill sqlservr]: exit code: 1

我的工作流操作是:

name: Docker Image CI MSSQL

on:
  schedule:
    - cron: '0 6 * * *'
  push:
    branches: [ master ]

jobs:

  build:

    runs-on: ubuntu-latest

    steps:
      -
        name: Checkout
        uses: actions/checkout@v3
      -
        name: Prepare Variables
        id: prepare
        run: |
          DOCKER_IMAGE=fallenreaper/eve-mssql
          VERSION=$(date -u +'%Y%m%d') 
          
          if [ "${{ github.event_name }}" = "schedule" ]; then
            VERSION=nightly
          fi
          TAGS="${DOCKER_IMAGE}:${VERSION}"
          if [[ $VERSION =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
            TAGS="$TAGS --tag ${DOCKER_IMAGE}:latest"
          fi
          
          echo ::set-output name=docker_image::${DOCKER_IMAGE}
          echo ::set-output name=version::${VERSION}
          echo ::set-output name=tags::${TAGS}
        
      -
        name: Login to DockerHub
        if: success() && github.event_name != 'pull_request'
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - 
        name: Docker Build & Push
        if: success() && github.event_name != 'pull_request'
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: ${{steps.prepare.outputs.tags}}
          context: mssql/.

所以我认为这会奏效。我正在构建的 Dockerfile 使用 mcr.microsoft.com/mssql/server:2017-latest,我认为它可以工作。

Docker 文件:

FROM mcr.microsoft.com/mssql/server:2017-latest

ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=Password123!
ENV MSSQL_PID=Developer
ARG DBNAME=evesde

EXPOSE 1433

RUN apt-get update \
    && apt-get install unzip -y
RUN wget -progress=bar:force -q -O sqlpackage.zip https://go.microsoft.com/fwlink/?linkid=2165213 \
    && unzip -qq sqlpackage.zip -d /opt/sqlpackage \
    && chmod +x /opt/sqlpackage/sqlpackage

RUN wget -o /tmp/db.bacpac https://www.fuzzwork.co.uk/dump/mssql-latest.bacpac

RUN ( /opt/mssql/bin/sqlservr & ) | grep -q "Service Broker manager has started" \
    && /opt/sqlpackage/sqlpackage /a:Import /tsn:. /tdn:${DBNAME} /tu:sa /tp:$SA_PASSWORD /sf:/tmp/db.bacpac \
    && rm /tmp/db.bacpac \
    && pkill sqlservr

编辑 当我不断阅读各种文档时,我试图理解和测试各种方法以查看我是否可以生成构建。我在想模拟 MAC 可能会有用,所以我也尝试使用操作:runs-on: macos:latest 看看是否可以解决它,但我还没有看到 运行 的收益docker-login-action@v1 会失败。

建议调查grep -q "Service Broker manager has started" &&

也许这会失败,因为您启动 /opt/mssql/bin/sqlservr 然后立即检查它是否启动。在大多数情况下,启动需要几秒钟。

测试我的论文是否 correct.Suggesting 在关键位置插入一些 sleep 10timeout 命令。

查看每个行项目,我最终得到了以下 Dockerfile。

FROM mcr.microsoft.com/mssql/server:2017-latest

ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=Password123!
ENV MSSQL_PID=Developer
ENV DBNAME=evesde

EXPOSE 1433

RUN apt-get update \
    && apt-get install unzip -y
RUN wget -progress=bar:force -q -O sqlpackage.zip https://go.microsoft.com/fwlink/?linkid=2165213 \
    && unzip -qq sqlpackage.zip -d /opt/sqlpackage \
    && chmod +x /opt/sqlpackage/sqlpackage

RUN wget -progress=bar:force -q -O /mssql-latest.bacpac https://www.fuzzwork.co.uk/dump/mssql-latest.bacpac

RUN ( /opt/mssql/bin/sqlservr & ) | grep -q "Service Broker manager has started" \
    && /opt/sqlpackage/sqlpackage /a:Import /tsn:. /tdn:$DBNAME /tu:sa /tp:$SA_PASSWORD /sf:/mssql-latest.bacpac \
    && pkill sqlservr
    
#Cleanup of created bulk files no longer needed.
RUN rm mssql-latest.bacpac sqlpackage.zip

主要区别在于 bacpac 文件的存储位置。创建该文件时似乎出现了问题。调整位置,拆分导入列表后,好像可以了。

注意:当文件在 TMP 中创建时,它似乎是部分创建的,因此它可以识别现有文件但它已损坏。不确定是否有大小限制,但这是一个观察结果。把它放在构建的 / 目录中给了我访问权限和完整的文件,所以我需要调整 /sf 引用。

最后因为有不再需要的挂起文件,我发现最好通过删除 sqlpackage 和 bacpac 文件来做一点清理。