我在 powershell 中创建了以下脚本,目的有两个:
从.env 文件中读取我的开发环境的本地 URL 设置并将其部署到 Windows hosts 文件。
利用该文件和脚本并验证docker服务是否已启动/活动,否则尝试将其打开,之后,执行命令从配置yml文件中提升docker设置。
这是我的 .env 文件(运行良好):
LH_URL="lh-2"
LH_URL_HOST="127.0.0.1 www.${LH_URL}.dock ${LH_URL}.dock www.${LH_URL}.pma.dock ${LH_URL}.pma.dock"
这是我的 .yml 文件(运行良好):
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
这是我的脚本 deploy.ps1:
if (!
(New-Object Security.Principal.WindowsPrincipal(
[Security.Principal.WindowsIdentity]::GetCurrent()
)).IsInRole(
[Security.Principal.WindowsBuiltInRole]::Administrator
)
) {
Start-Process `
-FilePath 'powershell' `
-ArgumentList (
'-File', $MyInvocation.MyCommand.Source, $args `
| %{ $_ }
) `
-Verb RunAs
exit
}
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$scriptDirectory = Split-Path -Parent $MyInvocation.MyCommand.Path
Set-Location -Path $scriptDirectory
$envFilePath = Join-Path -Path $scriptDirectory -ChildPath ".env"
if (Test-Path $envFilePath) {
Write-Host "`nFound the .env file in the following location: $((Get-Item -Path $envFilePath).FullName)"
$envFileContent = Get-Content $envFilePath -Raw
[System.Collections.Specialized.StringDictionary]$envVariables = @{}
$envFileContent -split [Environment]::NewLine | ForEach-Object {
$line = $_.Trim()
if ($line -match '^([^#=]+)=(.*)$') {
$envVariables[$Matches[1]] = $Matches[2]
}
}
$envVariables.GetEnumerator() | ForEach-Object {
[System.Environment]::SetEnvironmentVariable($_.Key, $_.Value, [System.EnvironmentVariableTarget]::Process)
}
}
else
{
Write-Host "Environment Variables File not found."
pause
exit 1
}
if ([System.Environment]::GetEnvironmentVariable("LH_URL") -and [System.Environment]::GetEnvironmentVariable("LH_URL_HOST")) {
$lh_url = [System.Environment]::GetEnvironmentVariable("LH_URL")
$lh_url_host = [System.Environment]::GetEnvironmentVariable("LH_URL_HOST")
$resolved_url_host = $ExecutionContext.InvokeCommand.ExpandString($lh_url_host)
$resolved_url_host = $resolved_url_host -replace '"', ''
$entry = "`n`n$resolved_url_host"
$hostsFile = "${env:SystemRoot}\System32\drivers\etc\hosts"
$currentContent = Get-Content $hostsFile -Raw
if ($currentContent -notlike "*$entry*") {
Add-Content -Path $hostsFile -Value $entry
Write-Host "The URLs were successfully added to the Host!!!"
}else{
Write-Host "No need to add URLs to the host!!!"
}
Write-Host "`nThe docker service is being validated and started if docker desktop is not open..."
$serviceName = "com.docker.service"
$dockerService = Get-Service -Name $serviceName
if ($dockerService.Status -eq "Running") {
Write-Host "The Docker service is running."
} else {
Start-Service -Name $serviceName
Write-Host "The Docker service has been started."
}
Write-Host "`nStarting the unloading and construction of containers..."
docker-compose -f docker-compose.yml up -d --force-recreate
pause
}
else {
Write-Host "LH_URL/LH_URL_HOST environment variables are not defined in the .env file"
pause
exit 1
}
脚本的第一部分强制执行权限...如果我打开并初始化了 docker 桌面,一切都会正常工作,但如果我停止 docker 的服务并运行脚本,以便脚本的一部分验证并初始化服务,我会收到以下消息:
在以下位置找到了 .env 文件:E:\Web\LH2\docker.env 无需向主机添加 URL!!!
正在验证并启动docker服务 如果docker桌面未打开...Docker服务已启动。
开始下载镜像和构建容器...连接时出错:在 Windows 上的默认守护进程配置中,docker 客户端必须以提升的权限运行才能连接:获取“http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json?all=1&filters=%7B%22label%22%3A%7B%22com.docker.compose.config-hash%22%3Atrue%2C%22com.docker.compose.project%3Ddocker%22%3Atrue%7D%7D”:打开//./pipe/docker_engine:无法找到指定文件。按“继续”按钮进入...:
笔记:由于操作系统是西班牙语,因此有些内容会以西班牙语显示。
问题: 我没有发现我的脚本有什么问题。比如缺少服务或其他东西。
更新:
对该主题进行更多研究并进行测试后,我已经能够验证尽管拥有docker桌面服务,但在运行powershell时,它无法访问告诉它通过以下方式连接的环境变量:"tcp://localhost :2375"
这意味着:$env:DOCKER_HOST
不存在或为空,即使我已经从同一个docker桌面菜单启用了它。并重新启动了电脑。