Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Numa tentativa de melhorar o desempenho geral dos contêineres do Windows, removemos muitos componentes das imagens de contêiner base do Windows, inclusive componentes como fontes, que na maioria dos casos não são relevantes. No entanto, alguns cenários podem precisar dessas fontes para que os aplicativos funcionem corretamente.
Prepare o seu ambiente
Quando removemos as fontes da imagem de contêiner base do Server Core, também removemos o recurso que instala novas fontes. Ao criar a imagem de contêiner, você deve incorporar as etapas a seguir para adicionar o recurso necessário novamente aos contêineres do Windows. Primeiro, você precisa de um host ou uma VM atualizada do Windows Server 2019 ou 2022 como host de contêiner. Restaurar os recursos removidos requer uma mídia atualizada.
Observação
Há algumas maneiras de adquirir uma mídia de instalação atualizada, mas a mais simples é usar uma VM do Windows Server 2019 ou 2022 e deixar o Windows Update atualizá-la. Você também precisa de um ISO da mídia RTM original do Windows Server 2019 ou 2022. Essa imagem pode ser adquirida por meio de uma Assinatura do Visual Studio ou um Centro de Serviços de Licença de Volume.
Para preparar o ambiente, você precisa de um host de contêiner do Windows configurado corretamente e compartilhar o diretório %windir%\WinSxS. Você também deve compartilhar o diretório %windir%\WinSxS. Para este exemplo, criamos um usuário local com uma senha gerada aleatoriamente:
No prompt de comando:
net user ShareUser <password> /ADD
net share WinSxS=%windir%\WinSxS /grant:ShareUser,READ
Para o PowerShell:
net user ShareUser ‘<password>’ /ADD
net share WinSxS=${env:windir}\WinSxS /grant:ShareUser,READ
Em seguida, monte a mídia RTM.
No prompt de comando:
set imagePath=<path to RTM ISO>
powershell Mount-DiskImage -ImagePath %imagePath%
set driveLetter=<drive letter of the mounted ISO>
set repairMountDir=%SystemDrive%\repair
mkdir repairMountDir
dism /mount-image /imagefile:"%driveLetter%\sources\install.wim" /index:1 /mountdir:%repairMountDir%
net share RTM=%repairMountDir% /grant:ShareUser,READ
Para PowerShell:
$imagePath = <path to RTM ISO>
Mount-DiskImage -ImagePath $imagePath
# Find the drive letter of the mounted ISO
$driveLetter = <drive letter of mounted ISO>
$repairMountDir = "${env:systemdrive}\repair"
mkdir $repairMountDir
dism /mount-image /imagefile:"$driveLetter\sources\install.wim" /index:1 /mountdir:$repairMountDir
net share RTM=$repairMountDir /grant:ShareUser,READ
Observação
Verifique se o índice de imagem 1 foi especificado ao montar a mídia RTM.
Em seguida, crie um arquivo chamado InstallFonts.cmd e adicione o seguinte conteúdo a ele:
REM Connect to the WinSxS share on the container host
for /f "tokens=3 delims=: " %%g in ('netsh interface ip show address ^| findstr /c:"Default Gateway"') do set GATEWAY=%%g
net use o: \\%GATEWAY%\WinSxS /user:ShareUser %SHARE_PW%
net use r: \\%GATEWAY%\RTM /user:ShareUser %SHARE_PW%if errorlevel 1 goto :eof
dism /online /enable-feature /featurename:ServerCoreFonts-NonCritical-Fonts-MinConsoleFonts /Source:O:\ /Source:R:\ /LimitAccess
dism /online /enable-feature /featurename:ServerCoreFonts-NonCritical-Fonts-Support /Source:O:\ /Source:R:\ /LimitAccess
dism /online /enable-feature /featurename:ServerCoreFonts-NonCritical-Fonts-BitmapFonts /Source:O:\ /Source:R:\ /LimitAccess
dism /online /enable-feature /featurename:ServerCoreFonts-NonCritical-Fonts-TrueType /Source:O:\ /Source:R:\ /LimitAccess
dism /online /enable-feature /featurename:ServerCoreFonts-NonCritical-Fonts-UAPFonts /Source:O:\ /Source:R:\ /LimitAccess
Agora você pode adicionar o contexto ao dockerfile. Aqui está um exemplo:
FROM mcr.microsoft.com/windows/servercore:ltsc2022
ARG SHARE_PW=
WORKDIR /install
COPY InstallFonts.cmd .
RUN InstallFonts.cmd
Com um dockerfile estabelecido, você pode criar e marcar a imagem de contêiner usando:
docker build -t <newname:tag> --build-arg SHARE_PW=<password> .
Você recebe o SHARE_PW no rastreamento de build, mas se configurá-lo como uma cadeia de caracteres gerada aleatoriamente para cada build, você não estará vazando um segredo real. Além disso, depois que o build for concluído, você poderá limpar o compartilhamento e o usuário usando:
net share WinSxS /delete
net user ShareUser /delete
Executar a carga de trabalho
Devido a uma limitação na maneira como os contêineres do Server Core lidam com fontes, você precisa informar especificamente ao Windows sobre as fontes recém-disponíveis no contêiner. Você deve executar um script do PowerShell depois que o contêiner for iniciado e antes de executar sua carga de trabalho. Sugerimos chamá-lo de LoadFonts.ps1:
$fontCSharpCode = @'
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
namespace FontResource
{
public class AddRemoveFonts
{
[DllImport("gdi32.dll")]
static extern int AddFontResource(string lpFilename);
public static int AddFont(string fontFilePath) {
try
{
return AddFontResource(fontFilePath);
}
catch
{
return 0;
}
}
}
}
'@
Add-Type $fontCSharpCode
foreach($font in $(gci C:\Windows\Fonts))
{
Write-Output "Loading $($font.FullName)"
[FontResource.AddRemoveFonts]::AddFont($font.FullName) | Out-Null
}
A Microsoft espera remover essa limitação em uma versão futura do Windows, mas o script é necessário para as versões atuais do Windows Server 2019 e 2022. Depois de criar o contêiner conforme descrito aqui e executar esse script dentro do contêiner, todas as fontes presentes no Windows Server Core estarão disponíveis para a carga de trabalho conteinerizada.
Problemas ao adicionar fontes
Se você encontrar problemas ao habilitar fontes em imagens de contêiner do Server Core, informe-nos na seção Problemas do nosso repositório GitHub.