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 10
或 timeout
命令。
查看每个行项目,我最终得到了以下 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 文件来做一点清理。
我开始着手 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 10
或 timeout
命令。
查看每个行项目,我最终得到了以下 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 文件来做一点清理。