Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Docker Image on Windows Base Image #439 #2332

Merged
merged 18 commits into from
Jan 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .github/workflows/PrValidation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,19 @@ jobs:
docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest azurite-queue -v
docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest azurite-table -v

Azurite_Windows_Docker:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- run: npm ci --legacy-peer-deps
- run: npm run docker:build-windows
- name: Validate docker image
run: |
docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest azurite -v
docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest azurite-blob -v
docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest azurite-queue -v
docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest azurite-table -v

Azurite_ExeTest:
runs-on: windows-latest
steps:
Expand Down
1 change: 1 addition & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
General:

- Changed the responds status code of not implemented API from 500 to 501.
- Added support for docker image based on Windows Base Image.
jwdb marked this conversation as resolved.
Show resolved Hide resolved

Blob:

Expand Down
75 changes: 75 additions & 0 deletions Dockerfile.Windows
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#
# Base-Node
#
FROM mcr.microsoft.com/windows/servercore:ltsc2022-amd64 AS nodewindows
jwdb marked this conversation as resolved.
Show resolved Hide resolved
# Install dependencies first
RUN mkdir c:\node
WORKDIR c:\\node
blueww marked this conversation as resolved.
Show resolved Hide resolved

RUN curl.exe -o Node.zip https://nodejs.org/dist/v22.12.0/node-v22.12.0-win-x64.zip
RUN tar -xf Node.zip -C c:\node
RUN del Node.zip

USER ContainerAdministrator
RUN setx /M PATH "%PATH%;C:\Node\node-v22.12.0-win-x64"
USER ContainerUser

#
# Builder
#
FROM nodewindows AS builder

RUN mkdir c:\azurite
WORKDIR c:\\azurite

COPY *.json LICENSE NOTICE.txt ./

# Copy the source code and build the app
COPY src ./src
COPY tests ./tests
RUN npm ci --unsafe-perm
RUN npm run build && \
npm install -g --unsafe-perm --loglevel verbose


#
# Production image
#
FROM nodewindows

ENV NODE_ENV=productions

RUN mkdir c:\azurite
WORKDIR c:\\azurite

# Default Workspace Volume
VOLUME [ "c:/data" ]

COPY package*.json ./
COPY LICENSE ./
COPY NOTICE.txt ./

COPY --from=builder c:/azurite/dist/ dist/

USER ContainerAdministrator
RUN icacls c:\azurite /grant "Authenticated Users":(OI)(CI)M
USER ContainerUser

RUN npm pkg set scripts.prepare="echo no-prepare"

RUN npm ci --unsafe-perm

RUN npm install -g --unsafe-perm --loglevel verbose

# Blob Storage Port
EXPOSE 10000
# Queue Storage Port
EXPOSE 10001
# Table Storage Port
EXPOSE 10002

ENTRYPOINT "cmd.exe /S /C"

WORKDIR C:\\Node\\node-v22.12.0-win-x64\\

CMD azurite -l c:/data --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0
23 changes: 23 additions & 0 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -548,6 +548,29 @@ jobs:
workingDirectory: "./"
displayName: "Validate docker image"

- job: dockerwindows
blueww marked this conversation as resolved.
Show resolved Hide resolved
displayName: Docker Windows Build
pool:
vmImage: "windows-latest"
steps:
- script: |
npm ci --legacy-peer-deps
workingDirectory: "./"
displayName: "npm ci --legacy-peer-deps"

- script: |
npm run docker:build-windows
workingDirectory: "./"
displayName: "Build docker image"

- script: |
docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest "cmd /s /c azurite" -v
docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest "cmd /s /c azurite-blob" -v
docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest "cmd /s /c azurite-queue" -v
docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest "cmd /s /c azurite-table" -v
workingDirectory: "./"
displayName: "Validate docker image"

- job: governance
displayName: Component Governance Component Detection
pool:
Expand Down
8 changes: 6 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -275,16 +275,20 @@
"vscode:pack": "vsce package",
"docker:prebuild": "echo skip",
"docker:build": "npm run docker:prebuild && cross-var docker build --no-cache --rm -f \"Dockerfile\" -t xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version . && cross-var docker tag xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version xstoreazurite.azurecr.io/public/azure-storage/azurite:latest",
"docker:build-windows": "npm run docker:prebuild && cross-var docker build --no-cache --rm -f \"Dockerfile.Windows\" -t xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version . && cross-var docker tag xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version xstoreazurite.azurecr.io/public/azure-storage/azurite:latest",
"docker:build:internal": "npm run docker:prebuild && cross-var docker build --no-cache --rm -f \"Dockerfile\" -t xstoreazurite.azurecr.io/internal/azure-storage/azurite:$npm_package_version . && cross-var docker tag xstoreazurite.azurecr.io/internal/azure-storage/azurite:$npm_package_version xstoreazurite.azurecr.io/internal/azure-storage/azurite:latest",
"docker:build-windows:internal": "npm run docker:prebuild && cross-var docker build --no-cache --rm -f \"Dockerfile.Windows\" -t xstoreazurite.azurecr.io/internal/azure-storage/azurite:$npm_package_version . && cross-var docker tag xstoreazurite.azurecr.io/internal/azure-storage/azurite:$npm_package_version xstoreazurite.azurecr.io/internal/azure-storage/azurite:latest",
"docker:publish": "cross-var docker push xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version",
"docker:publish:internal": "cross-var docker push xstoreazurite.azurecr.io/internal/azure-storage/azurite:$npm_package_version",
"docker:init-multi-platform-builder": "docker buildx create --name multi-platform-builder --use",
"docker:build-amd64": "cross-var docker buildx build --platform linux/amd64 --load --no-cache --rm -f \"Dockerfile\" -t xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-amd64 .",
"docker:build-windows-amd64": "cross-var docker buildx build --platform windows/amd64 --load --no-cache --rm -f \"Dockerfile.Windows\" -t xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-windows-amd64 .",
"docker:build-arm64": "cross-var docker buildx build --platform linux/arm64 --load --no-cache --rm -f \"Dockerfile\" -t xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-arm64 .",
"docker:publish-amd64": "cross-var docker push xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-amd64",
"docker:publish-windows-amd64": "cross-var docker push xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-windows-amd64",
"docker:publish-arm64": "cross-var docker push xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-arm64",
"docker:create-manifest-versioned": "cross-var docker manifest create xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-amd64 xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-arm64",
"docker:create-manifest-latest": "cross-var docker manifest create xstoreazurite.azurecr.io/public/azure-storage/azurite:latest xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-amd64 xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-arm64",
"docker:create-manifest-versioned": "cross-var docker manifest create xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-amd64 xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-windows-amd64 xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-arm64",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just to check what's the effect after publish the manifest.
With the originally manifest, when user run Azurite docker image without specifying platform, docker will choose the docker image most match the current platform (ARM64 platform will choose AMD64 docker image, AMD64 platform will choose AMD64 docker image). After the windows-amd64 image is added, what will happen when user run Azurite docker image without specifying platform?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The platform is chooses includes the os name, hence it currently throwing an error on windows ( no matching manifest for windows/amd64 in the manifest list entries) adding this image will add that specific platform to the manifest.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With current Azurite release (before the change), I will install AMD64 docker image in my machine (my machine is windows with AMD64).
So after your change, what will happen on different platform/OS?

And for the error, do you mean you will resolve it, or it's already resolved?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you are running Docker in Windows Container mode (this is an option within Docker-Desktop), with the current release this will throw an error.
After the change, the other platforms will be unaffected (since they will use the linux/amd64 image).

You can view the platform docker is running internally on with docker info -f "{{.OSType}}". For me this gives windows.

Copy link
Member

@blueww blueww Jan 4, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Get it. Thanks!

And on my windows machine run docker info -f "{{.OSType}}", will get result "linux".

"docker:create-manifest-latest": "cross-var docker manifest create xstoreazurite.azurecr.io/public/azure-storage/azurite:latest xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-amd64 xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-windows-amd64 xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version-arm64",
"docker:publish-manifest-versioned": "cross-var docker manifest push xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version",
"docker:publish-manifest-latest": "cross-var docker manifest push xstoreazurite.azurecr.io/public/azure-storage/azurite:latest",
"prepare": "npm run build",
Expand Down
Loading