我正在使用 Powershell 在 Docker 容器中创建 Windows 计划任务。作为测试,我有一个简单的批处理文件,每小时将当前日期/时间写入文本文件一次。这很完美:
RUN $action = New-ScheduledTaskAction -Execute 'C:\folder\task-tester.cmd'; \
$trigger = New-ScheduledTaskTrigger -Daily -At 12am; \
$settings = New-ScheduledTaskSettingsSet; \
$task = Register-ScheduledTask -TaskName 'Write to text file' -User 'SYSTEM' -Trigger $trigger -Action $action -Settings $settings; \
$task.Triggers.Repetition.Duration = 'P1D'; \
$task.Triggers.Repetition.Interval = 'PT1H'; \
$task | Set-ScheduledTask
当我尝试执行 .NET 控制台应用程序时,它不起作用。
RUN $action = New-ScheduledTaskAction -Execute 'C:\folder\thingy.exe' -WorkingDirectory 'C:\folder'; \
$trigger = New-ScheduledTaskTrigger -Daily -At 10am; \
$settings = New-ScheduledTaskSettingsSet; \
Register-ScheduledTask -TaskName 'Task name' -User 'SYSTEM' -Trigger $trigger -Action $action -Settings $settings
具体来说,任务似乎运行了——“上次运行”日期/时间正确且结果为 0(零),但控制台应用程序本身并未执行。
在上面的命令中,我设置了工作目录(.NET 控制台应用程序的常见陷阱)。
如果我通过 SSH 进入容器,我可以执行“thing.exe”,并且它会按预期工作。如果我通过 PowerShell 手动执行计划任务Start-ScheduleTask
,同样,似乎什么也没有发生。
我尝试使用 PowerShell 查询事件日志,但没有看到任何有用的信息。
上述命令的变体具有更明确的选项(例如兼容性和运行级别)会产生相同的结果 - 即任务不运行:
RUN $action = New-ScheduledTaskAction -Execute 'C:\folder\thingy.exe' -WorkingDirectory 'C:\folder' ; \
$trigger = New-ScheduledTaskTrigger -Daily -At 10am; \
$settings = New-ScheduledTaskSettingsSet -Compatibility Win8; \
$principal = New-ScheduledTaskPrincipal -UserID 'NT AUTHORITY\SYSTEM' -LogonType ServiceAccount -RunLevel Highest; \
Register-ScheduledTask -TaskName 'Task name' -Trigger $trigger -Action $action -Settings $settings -Principal $principal
有人遇到过这个问题并解决了吗?或者有人能帮我用 PowerShell 从容器中获取更多诊断信息吗?
谢谢!
答案1
对于将来可能遇到此问题的人:
我在容器中运行了多个进程(我知道,这不是理想的,但在这种情况下是不可避免的),而我的情况是环境变量不适用于计划任务调用的进程。
当环境变量作为 Docker 构建的一部分创建时,创建的任何环境变量仅对 Docker 启动的进程可见 - 例如 IIS。我的计划任务也需要访问相同的环境变量。
解决方案是将 dockerfile 中的入口点更改为 PowerShell 脚本,如建议的那样本文。
ENTRYPOINT ["powershell.exe", "C:\\bootstrap.ps1"]
这个引导脚本可以做任何你想做的事情,在这种情况下,它允许我将传递给 Docker 启动的进程(现在是这个脚本)的环境变量“提升”到机器级别,以便容器中的其他进程可以看到它们。