Skip to content

Commit 41d9772

Browse files
committed
Images are now based on Alpine
1 parent 41c33e8 commit 41d9772

File tree

2 files changed

+229
-9
lines changed

2 files changed

+229
-9
lines changed

.github/workflows/docker.yml

+183-9
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,184 @@ on:
1010
- cron: "0 12 1-7 * 2"
1111

1212
jobs:
13+
docker-image-alpine:
14+
strategy:
15+
matrix:
16+
version:
17+
- alpine: 3.21
18+
sqlcmd: "17.10.1.1-1"
19+
sqlcmd_minor: "17.10"
20+
sqlcmd_major: "17"
21+
msodbcsql_version: "17.10.6.1-1"
22+
msodbcsql_suffix: 17
23+
download_url: "https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/"
24+
latest: false
25+
package_suffix: ""
26+
package_path: "/opt/mssql-tools"
27+
- alpine: 3.21
28+
sqlcmd: "18.2.1.1-1"
29+
sqlcmd_minor: "18.2"
30+
sqlcmd_major: ""
31+
msodbcsql_version: "18.2.1.1-1"
32+
msodbcsql_suffix: 18
33+
download_url: "https://download.microsoft.com/download/1/f/f/1fffb537-26ab-4947-a46a-7a45c27f6f77/"
34+
latest: false
35+
package_suffix: "18"
36+
package_path: "/opt/mssql-tools18"
37+
- alpine: 3.21
38+
sqlcmd: "18.4.1.1-1"
39+
sqlcmd_minor: "18.4"
40+
sqlcmd_major: "18"
41+
msodbcsql_version: "18.4.1.1-1"
42+
msodbcsql_suffix: 18
43+
download_url: "https://download.microsoft.com/download/7/6/d/76de322a-d860-4894-9945-f0cc5d6a45f8/"
44+
latest: true # newest possible version available -> tag as latest alpine-latest
45+
package_suffix: "18"
46+
package_path: "/opt/mssql-tools18"
47+
48+
env:
49+
IMAGE_NAME_FULL: "fabiang/sqlcmd:${{ matrix.version.sqlcmd }}"
50+
IMAGE_NAME_MINOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_minor }}"
51+
IMAGE_NAME_MAJOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_major }}"
52+
IMAGE_NAME_ALPINE_FULL: "fabiang/sqlcmd:${{ matrix.version.sqlcmd }}-alpine${{ matrix.version.alpine }}"
53+
IMAGE_NAME_ALPINE_MINOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_minor }}-alpine${{ matrix.version.alpine }}"
54+
IMAGE_NAME_ALPINE_MAJOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_major }}-alpine${{ matrix.version.alpine }}"
55+
IMAGE_LATEST: "fabiang/sqlcmd:latest"
56+
IMAGE_LATEST_ALPINE: "fabiang/sqlcmd:alpine-latest"
57+
IMAGE_LATEST_ALPINE_MINOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_minor }}-alpine"
58+
IMAGE_LATEST_ALPINE_MAJOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_major }}-alpine"
59+
60+
runs-on: ubuntu-latest
61+
62+
name: "Sqlcmd v${{ matrix.version.sqlcmd }} (Alpine ${{ matrix.version.alpine }})"
63+
64+
steps:
65+
- uses: actions/checkout@v3
66+
67+
- name: SQLServer Checksum
68+
id: sqlserver-checksum
69+
shell: bash
70+
run: |
71+
echo "checksum=$(curl --silent -L --header 'Accept: application/vnd.docker.distribution.manifest.v2+json' 'https://mcr.microsoft.com/v2/mssql/server/manifests/2022-latest' | jq -r '.config.digest')" >> $GITHUB_OUTPUT
72+
73+
- name: Cache Docker Image
74+
id: docker-image-cache
75+
uses: actions/cache@v3
76+
with:
77+
path: '*.tar'
78+
key: docker-image-cache-${{ runner.os }}-${{ steps.sqlserver-checksum.outputs.checksum }}
79+
80+
- name: Load SQLServer image
81+
if: steps.docker-image-cache.outputs.cache-hit == 'true'
82+
run: docker image load -i sqlserver.tar
83+
84+
- name: Run SQL Server
85+
run: |
86+
docker run \
87+
--pull always \
88+
-e 'ACCEPT_EULA=Y' \
89+
-e 'MSSQL_SA_PASSWORD=yourStrong(!)Password' \
90+
-p 1433:1433 \
91+
-d \
92+
--name SQLServer \
93+
--rm \
94+
mcr.microsoft.com/mssql/server:2022-latest
95+
96+
- name: Save SQLServer image
97+
if: steps.docker-image-cache.outputs.cache-hit != 'true'
98+
run: docker image save -o sqlserver.tar mcr.microsoft.com/mssql/server:2022-latest
99+
100+
- uses: satackey/[email protected]
101+
continue-on-error: true
102+
103+
- name: Build Image
104+
run: |
105+
docker build -f alpine/Dockerfile \
106+
-t '${{ env.IMAGE_NAME_FULL }}' \
107+
-t '${{ env.IMAGE_NAME_ALPINE_FULL }}' \
108+
'--build-arg=ALPINE_VERSION=${{ matrix.version.alpine }}' \
109+
\
110+
'--build-arg=MSSQLTOOLS_VERSION=${{ matrix.version.sqlcmd }}' \
111+
'--build-arg=MSSQLTOOLS_SUFFIX=${{ matrix.version.package_suffix }}' \
112+
'--build-arg=MSSQLTOOLS_PATH=${{ matrix.version.package_path }}' \
113+
\
114+
'--build-arg=MSODBCSQL_VERSION=${{ matrix.version.msodbcsql_version }}' \
115+
'--build-arg=MSODBCSQL_SUFFIX=${{ matrix.version.msodbcsql_suffix }}' \
116+
\
117+
'--build-arg=MICROSOFT_DOWNLOAD_URL=${{ matrix.version.download_url }}' \
118+
.
119+
120+
- name: Wait for SQLServer to become available
121+
uses: iFaxity/[email protected]
122+
with:
123+
resource: tcp:localhost:1433
124+
timeout: 1800000
125+
interval: 5000
126+
log: true
127+
128+
- name: Test image
129+
run: |
130+
docker run -t --rm --entrypoint='' --network=host \
131+
'${{ env.IMAGE_NAME_FULL }}' \
132+
sqlcmd -b -C -S 127.0.0.1,1433 -U sa -P 'yourStrong(!)Password' -Q 'SELECT @@VERSION'
133+
134+
- name: Stop SQLServer
135+
if: always()
136+
run: docker stop SQLServer
137+
138+
- name: Tag Minor
139+
if: "${{ matrix.version.sqlcmd_minor != '' }}"
140+
run: |
141+
docker tag '${{ env.IMAGE_NAME_FULL }}' '${{ env.IMAGE_NAME_MINOR }}'
142+
docker tag '${{ env.IMAGE_NAME_FULL }}' '${{ env.IMAGE_NAME_ALPINE_MINOR }}'
143+
docker tag '${{ env.IMAGE_NAME_FULL }}' '${{ env.IMAGE_LATEST_ALPINE_MINOR }}'
144+
145+
- name: Tag Major
146+
if: "${{ matrix.version.sqlcmd_major != '' }}"
147+
run: |
148+
docker tag '${{ env.IMAGE_NAME_FULL }}' '${{ env.IMAGE_NAME_MAJOR }}'
149+
docker tag '${{ env.IMAGE_NAME_FULL }}' '${{ env.IMAGE_NAME_ALPINE_MAJOR }}'
150+
docker tag '${{ env.IMAGE_NAME_FULL }}' '${{ env.IMAGE_LATEST_ALPINE_MAJOR }}'
151+
152+
- name: Tag Latest
153+
if: "${{ matrix.version.latest == true }}"
154+
run: |
155+
docker tag '${{ env.IMAGE_NAME_FULL }}' '${{ env.IMAGE_LATEST }}'
156+
docker tag '${{ env.IMAGE_NAME_FULL }}' '${{ env.IMAGE_LATEST_ALPINE }}'
157+
158+
- name: Docker Hub login
159+
if: "${{ github.ref == 'refs/heads/main' }}"
160+
uses: azure/docker-login@v1
161+
with:
162+
username: ${{ secrets.CONTAINER_REGISTRY_USERNAME }}
163+
password: ${{ secrets.CONTAINER_REGISTRY_PASSWORD }}
164+
165+
- name: Push Image
166+
if: "${{ github.ref == 'refs/heads/main' }}"
167+
run: |
168+
docker push '${{ env.IMAGE_NAME_FULL }}'
169+
docker push '${{ env.IMAGE_NAME_ALPINE_FULL }}'
170+
171+
- name: Push Image Minor
172+
if: "${{ matrix.version.sqlcmd_minor != '' && github.ref == 'refs/heads/main' }}"
173+
run: |
174+
docker push '${{ env.IMAGE_NAME_MINOR }}'
175+
docker push '${{ env.IMAGE_NAME_ALPINE_MINOR }}'
176+
docker push '${{ env.IMAGE_LATEST_ALPINE_MINOR }}'
177+
178+
- name: Push Image Major
179+
if: "${{ matrix.version.sqlcmd_major != '' && github.ref == 'refs/heads/main' }}"
180+
run: |
181+
docker push '${{ env.IMAGE_NAME_MAJOR }}'
182+
docker push '${{ env.IMAGE_NAME_ALPINE_MAJOR }}'
183+
docker push '${{ env.IMAGE_LATEST_ALPINE_MAJOR }}'
184+
185+
- name: Push Lastest
186+
if: "${{ matrix.version.latest == true && github.ref == 'refs/heads/main' }}"
187+
run: |
188+
docker push '${{ env.IMAGE_LATEST }}'
189+
docker push '${{ env.IMAGE_LATEST_ALPINE }}'
190+
13191
docker-image-ubuntu:
14192
strategy:
15193
matrix:
@@ -24,7 +202,7 @@ jobs:
24202
- ubuntu: 22.04
25203
sqlcmd: "17.10.1.1-1"
26204
sqlcmd_minor: "17.10"
27-
sqlcmd_major: "17"
205+
sqlcmd_major: ""
28206
latest: false
29207
package_suffix: ""
30208
package_path: "/opt/mssql-tools"
@@ -39,18 +217,17 @@ jobs:
39217
sqlcmd: "18.4.1.1-1"
40218
sqlcmd_minor: "18.4"
41219
sqlcmd_major: "18"
42-
latest: true # newest possible version available -> tag as latest ubuntu-latest
220+
latest: true
43221
package_suffix: "18"
44222
package_path: "/opt/mssql-tools18"
45223

46224
env:
47-
IMAGE_NAME_FULL: "fabiang/sqlcmd:${{ matrix.version.sqlcmd }}"
48-
IMAGE_NAME_MINOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_minor }}"
49-
IMAGE_NAME_MAJOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_major }}"
225+
IMAGE_NAME_FULL: "fabiang/sqlcmd:${{ matrix.version.sqlcmd }}-ubuntu"
226+
IMAGE_NAME_MINOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_minor }}-ubuntu"
227+
IMAGE_NAME_MAJOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_major }}-ubuntu"
50228
IMAGE_NAME_UBUNTU_FULL: "fabiang/sqlcmd:${{ matrix.version.sqlcmd }}-ubuntu${{ matrix.version.ubuntu }}"
51229
IMAGE_NAME_UBUNTU_MINOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_minor }}-ubuntu${{ matrix.version.ubuntu }}"
52230
IMAGE_NAME_UBUNTU_MAJOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_major }}-ubuntu${{ matrix.version.ubuntu }}"
53-
IMAGE_LATEST: "fabiang/sqlcmd:latest"
54231
IMAGE_LATEST_UBUNTU: "fabiang/sqlcmd:ubuntu-latest"
55232
IMAGE_LATEST_UBUNTU_MINOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_minor }}-ubuntu"
56233
IMAGE_LATEST_UBUNTU_MAJOR: "fabiang/sqlcmd:${{ matrix.version.sqlcmd_major }}-ubuntu"
@@ -144,7 +321,6 @@ jobs:
144321
- name: Tag Latest
145322
if: "${{ matrix.version.latest == true }}"
146323
run: |
147-
docker tag '${{ env.IMAGE_NAME_FULL }}' '${{ env.IMAGE_LATEST }}'
148324
docker tag '${{ env.IMAGE_NAME_FULL }}' '${{ env.IMAGE_LATEST_UBUNTU }}'
149325
150326
- name: Docker Hub login
@@ -157,7 +333,6 @@ jobs:
157333
- name: Push Image
158334
if: "${{ github.ref == 'refs/heads/main' }}"
159335
run: |
160-
docker push '${{ env.IMAGE_NAME_FULL }}'
161336
docker push '${{ env.IMAGE_NAME_UBUNTU_FULL }}'
162337
163338
- name: Push Image Minor
@@ -177,5 +352,4 @@ jobs:
177352
- name: Push Lastest
178353
if: "${{ matrix.version.latest == true && github.ref == 'refs/heads/main' }}"
179354
run: |
180-
docker push '${{ env.IMAGE_LATEST }}'
181355
docker push '${{ env.IMAGE_LATEST_UBUNTU }}'

alpine/Dockerfile

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#syntax=docker/dockerfile:1
2+
ARG ALPINE_VERSION=3.21
3+
FROM --platform=$BUILDPLATFORM alpine:${ALPINE_VERSION}
4+
5+
ARG TARGETARCH
6+
7+
ARG MSODBCSQL_VERSION=18.4.1.1-1
8+
ARG MSSQLTOOLS_VERSION=18.4.1.1-1
9+
10+
# Microsoft decided to have a suffix for newer versions of mssql-tools, e.g. mssql-tools18
11+
ARG MSSQLTOOLS_SUFFIX=18
12+
ARG MSODBCSQL_SUFFIX=18
13+
14+
# and also the path changed on newer versions. It's a mess.
15+
ARG MSSQLTOOLS_PATH=/opt/mssql-tools18
16+
17+
ARG MICROSOFT_DOWNLOAD_URL=https://download.microsoft.com/download/7/6/d/76de322a-d860-4894-9945-f0cc5d6a45f8/
18+
19+
ENV PATH=$MSSQLTOOLS_PATH/bin:$PATH
20+
21+
RUN apk add --update curl gnupg \
22+
# Helper command to convert \r\n to \n,
23+
# since sqlcmd prints Windows line endings
24+
dos2unix; \
25+
\
26+
export MSODBCSQL_PACKAGE=msodbcsql${MSODBCSQL_SUFFIX}_${MSODBCSQL_VERSION}_${TARGETARCH}; \
27+
export MSSQL_TOOLS_PACKAGE=mssql-tools${MSSQLTOOLS_SUFFIX}_${MSSQLTOOLS_VERSION}_${TARGETARCH}; \
28+
\
29+
curl -v --fail -O ${MICROSOFT_DOWNLOAD_URL}${MSODBCSQL_PACKAGE}.apk \
30+
&& curl -v --fail -O ${MICROSOFT_DOWNLOAD_URL}${MSSQL_TOOLS_PACKAGE}.apk \
31+
\
32+
&& curl -v --fail -O ${MICROSOFT_DOWNLOAD_URL}${MSODBCSQL_PACKAGE}.sig \
33+
&& curl -v --fail -O ${MICROSOFT_DOWNLOAD_URL}${MSSQL_TOOLS_PACKAGE}.sig \
34+
\
35+
&& curl https://packages.microsoft.com/keys/microsoft.asc | gpg --import - \
36+
&& gpg --verify ${MSODBCSQL_PACKAGE}.sig ${MSODBCSQL_PACKAGE}.apk \
37+
&& gpg --verify ${MSSQL_TOOLS_PACKAGE}.sig ${MSSQL_TOOLS_PACKAGE}.apk \
38+
\
39+
&& apk add --allow-untrusted ${MSODBCSQL_PACKAGE}.apk \
40+
&& apk add --allow-untrusted ${MSSQL_TOOLS_PACKAGE}.apk \
41+
&& rm -f ${MSODBCSQL_PACKAGE}.apk ${MSSQL_TOOLS_PACKAGE}.apk
42+
43+
## should be set after locale was generated, overwise triggers warnings
44+
ENV LANG="en_US.UTF-8" LANGUAGE="en_US.UTF-8" LC_ALL="en_US.UTF-8"
45+
46+
ENTRYPOINT ["sqlcmd"]

0 commit comments

Comments
 (0)