mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-21 19:01:49 +00:00
test images: powershell-helper linux cache
We can cache the powershell-helper image's results into a scratch Linux image using docker buildx. This will allow us to spend less time pulling the data we need from the powershell-helper image when we need it. Additionally, docker buildx might have some issues with cross-registry images, so this will allow us to circumvent it.
This commit is contained in:
parent
0ed8ee6fd7
commit
ac6ebc260c
@ -57,7 +57,7 @@ RUN mkdir /curl-full /curl-dir && \
|
|||||||
|
|
||||||
# Windows Stage
|
# Windows Stage
|
||||||
FROM --platform=linux/amd64 $REGISTRY/windows-servercore-cache:1.0-linux-amd64-$OS_VERSION as servercore-helper
|
FROM --platform=linux/amd64 $REGISTRY/windows-servercore-cache:1.0-linux-amd64-$OS_VERSION as servercore-helper
|
||||||
FROM e2eteam/powershell-helper:6.2.7 as ps-helper
|
FROM e2eteam/powershell-helper:6.2.7-linux-cache as ps-helper
|
||||||
FROM $BASEIMAGE
|
FROM $BASEIMAGE
|
||||||
|
|
||||||
COPY --from=prep /tmp-dir /tmp
|
COPY --from=prep /tmp-dir /tmp
|
||||||
|
@ -23,7 +23,8 @@ sub-build-%:
|
|||||||
img_version=$(shell cat $*/VERSION); \
|
img_version=$(shell cat $*/VERSION); \
|
||||||
docker --tlsverify --tlscacert "$(DOCKER_CERT_PATH)/ca.pem" \
|
docker --tlsverify --tlscacert "$(DOCKER_CERT_PATH)/ca.pem" \
|
||||||
--tlscert "$(DOCKER_CERT_PATH)/cert.pem" --tlskey "$(DOCKER_CERT_PATH)/key.pem" \
|
--tlscert "$(DOCKER_CERT_PATH)/cert.pem" --tlskey "$(DOCKER_CERT_PATH)/key.pem" \
|
||||||
-H "$(REMOTE_DOCKER_URL)" build --no-cache --pull -t "$(REGISTRY)/$*:$${img_version}" $*/
|
-H "$(REMOTE_DOCKER_URL)" build --no-cache --pull -t "$(REGISTRY)/$*:$${img_version}" \
|
||||||
|
-f $*/Dockerfile_windows $*/
|
||||||
|
|
||||||
sub-push-%:
|
sub-push-%:
|
||||||
img_version=`cat $*/VERSION`; \
|
img_version=`cat $*/VERSION`; \
|
||||||
@ -31,8 +32,15 @@ sub-push-%:
|
|||||||
--tlscert "$(DOCKER_CERT_PATH)/cert.pem" --tlskey "$(DOCKER_CERT_PATH)/key.pem" \
|
--tlscert "$(DOCKER_CERT_PATH)/cert.pem" --tlskey "$(DOCKER_CERT_PATH)/key.pem" \
|
||||||
-H "$(REMOTE_DOCKER_URL)" push "$(REGISTRY)/$*:$${img_version}"
|
-H "$(REMOTE_DOCKER_URL)" push "$(REGISTRY)/$*:$${img_version}"
|
||||||
|
|
||||||
|
sub-repush-as-linux-%:
|
||||||
|
img_version=$(shell cat $*/VERSION); \
|
||||||
|
docker buildx build --progress=plain --no-cache --pull --output=type=registry --platform "linux/amd64" \
|
||||||
|
--build-arg SOURCE="$(REGISTRY)/$*:$${img_version}" -t "$(REGISTRY)/$*:$${img_version}"-linux-cache $*/
|
||||||
|
|
||||||
all-build: $(foreach image, ${ALL_IMAGES}, sub-build-${image})
|
all-build: $(foreach image, ${ALL_IMAGES}, sub-build-${image})
|
||||||
|
|
||||||
all-push: all-build $(foreach image, ${ALL_IMAGES}, sub-push-${image})
|
all-push: all-build $(foreach image, ${ALL_IMAGES}, sub-push-${image})
|
||||||
|
|
||||||
.PHONY: all-build all-push
|
all-push-as-linux: all-push $(foreach image, ${ALL_IMAGES}, sub-repush-as-linux-${image})
|
||||||
|
|
||||||
|
.PHONY: all-build all-push all-push-as-linux
|
||||||
|
@ -71,10 +71,22 @@ Finally, the node must be able to push the images to the desired container regis
|
|||||||
authenticated with the registry you're pushing to.
|
authenticated with the registry you're pushing to.
|
||||||
|
|
||||||
|
|
||||||
|
### Additional configuration
|
||||||
|
|
||||||
|
The `powershell-helper` image uses `mcr.microsoft.com/windows/nanoserver:1809` as a base image.
|
||||||
|
Note that `docker buildx` has an issue pulling cross-registry images when building images, and in
|
||||||
|
order to circumvent this issue, the make target `all-push-as-linux` will push a Linux cache image
|
||||||
|
which will contain only the necessary bits, and this cache image can then be used in the regular
|
||||||
|
image building process. As an additional benefit, using a Linux cache image will be faster.
|
||||||
|
|
||||||
|
In order to build the Linux cache image, `docker buildx` is needed. For more information about it
|
||||||
|
can be read [here](../README.md).
|
||||||
|
|
||||||
|
|
||||||
## Building images
|
## Building images
|
||||||
|
|
||||||
The images are built through `make`:
|
The images are built through `make`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
make REGISTRY=foo_registry REMOTE_DOCKER_URL=$REMOTE_DOCKER_URL all-push
|
make REGISTRY=foo_registry REMOTE_DOCKER_URL=$REMOTE_DOCKER_URL all-push-as-linux
|
||||||
```
|
```
|
||||||
|
@ -12,40 +12,17 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
FROM mcr.microsoft.com/windows/servercore:ltsc2019 as prep
|
ARG SOURCE
|
||||||
|
|
||||||
ENV PS_VERSION=6.2.7
|
# NOTE(claudiub): The src image is already based on nanoserver, but it seems that docker buildx
|
||||||
ADD https://github.com/PowerShell/PowerShell/releases/download/v$PS_VERSION/PowerShell-$PS_VERSION-win-x64.zip /PowerShell/powershell.zip
|
# has an issue pulling cross-registry images, and we avoid that by pulling it ourselves.
|
||||||
|
FROM --platform="windows/amd64" mcr.microsoft.com/windows/nanoserver:1809 as nanoserver
|
||||||
|
FROM --platform="windows/amd64" $SOURCE as src
|
||||||
|
FROM scratch
|
||||||
|
|
||||||
RUN cd C:\PowerShell &\
|
# NOTE(claudiub): We're basically forcing docker buildx to finish pulling the nanoserver image
|
||||||
tar.exe -xf powershell.zip &\
|
# before continuing with the rest of this Dockerfile.
|
||||||
del powershell.zip &\
|
COPY --from=nanoserver /License.txt /License.txt
|
||||||
mklink powershell.exe pwsh.exe
|
|
||||||
|
|
||||||
FROM mcr.microsoft.com/windows/nanoserver:1809
|
COPY --from=src /PowerShell /PowerShell
|
||||||
|
COPY --from=src /Users/ContainerAdministrator/AppData/Local/Microsoft/Windows/PowerShell/docker/ModuleAnalysisCache /Users/ContainerAdministrator/AppData/Local/Microsoft/Windows/PowerShell/docker/ModuleAnalysisCache
|
||||||
COPY --from=prep /PowerShell /PowerShell
|
|
||||||
|
|
||||||
# set a fixed location for the Module analysis cache
|
|
||||||
ENV LOCALAPPDATA="C:\Users\ContainerAdministrator\AppData\Local" \
|
|
||||||
PSModuleAnalysisCachePath="C:\Users\ContainerAdministrator\AppData\Local\Microsoft\Windows\PowerShell\docker\ModuleAnalysisCache" \
|
|
||||||
# Persist %PSCORE% ENV variable for user convenience
|
|
||||||
PSCORE="C:\PowerShell\pwsh.exe"
|
|
||||||
|
|
||||||
# use downloaded powershell
|
|
||||||
USER ContainerAdministrator
|
|
||||||
RUN setx /M PATH "C:\Powershell\;%PATH%"
|
|
||||||
|
|
||||||
# intialize powershell module cache
|
|
||||||
RUN powershell \
|
|
||||||
-NoLogo \
|
|
||||||
-NoProfile \
|
|
||||||
-Command " \
|
|
||||||
$stopTime = (get-date).AddMinutes(15); \
|
|
||||||
$ErrorActionPreference = 'Stop' ; \
|
|
||||||
$ProgressPreference = 'SilentlyContinue' ; \
|
|
||||||
while(!(Test-Path -Path $env:PSModuleAnalysisCachePath)) { \
|
|
||||||
Write-Host "'Waiting for $env:PSModuleAnalysisCachePath'" ; \
|
|
||||||
if((get-date) -gt $stopTime) { throw 'timout expired'} \
|
|
||||||
Start-Sleep -Seconds 6 ; \
|
|
||||||
}"
|
|
||||||
|
51
test/images/windows/powershell-helper/Dockerfile_windows
Normal file
51
test/images/windows/powershell-helper/Dockerfile_windows
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
# Copyright 2020 The Kubernetes Authors.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/windows/servercore:ltsc2019 as prep
|
||||||
|
|
||||||
|
ENV PS_VERSION=6.2.7
|
||||||
|
ADD https://github.com/PowerShell/PowerShell/releases/download/v$PS_VERSION/PowerShell-$PS_VERSION-win-x64.zip /PowerShell/powershell.zip
|
||||||
|
|
||||||
|
RUN cd C:\PowerShell &\
|
||||||
|
tar.exe -xf powershell.zip &\
|
||||||
|
del powershell.zip &\
|
||||||
|
mklink powershell.exe pwsh.exe
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/windows/nanoserver:1809
|
||||||
|
|
||||||
|
COPY --from=prep /PowerShell /PowerShell
|
||||||
|
|
||||||
|
# set a fixed location for the Module analysis cache
|
||||||
|
ENV LOCALAPPDATA="C:\Users\ContainerAdministrator\AppData\Local" \
|
||||||
|
PSModuleAnalysisCachePath="C:\Users\ContainerAdministrator\AppData\Local\Microsoft\Windows\PowerShell\docker\ModuleAnalysisCache" \
|
||||||
|
# Persist %PSCORE% ENV variable for user convenience
|
||||||
|
PSCORE="C:\PowerShell\pwsh.exe"
|
||||||
|
|
||||||
|
# use downloaded powershell
|
||||||
|
USER ContainerAdministrator
|
||||||
|
RUN setx /M PATH "C:\Powershell\;%PATH%"
|
||||||
|
|
||||||
|
# intialize powershell module cache
|
||||||
|
RUN powershell \
|
||||||
|
-NoLogo \
|
||||||
|
-NoProfile \
|
||||||
|
-Command " \
|
||||||
|
$stopTime = (get-date).AddMinutes(15); \
|
||||||
|
$ErrorActionPreference = 'Stop' ; \
|
||||||
|
$ProgressPreference = 'SilentlyContinue' ; \
|
||||||
|
while(!(Test-Path -Path $env:PSModuleAnalysisCachePath)) { \
|
||||||
|
Write-Host "'Waiting for $env:PSModuleAnalysisCachePath'" ; \
|
||||||
|
if((get-date) -gt $stopTime) { throw 'timout expired'} \
|
||||||
|
Start-Sleep -Seconds 6 ; \
|
||||||
|
}"
|
Loading…
Reference in New Issue
Block a user