in src/Cli/func/Helpers/PythonHelpers.cs [488:546]
private static async Task RestorePythonRequirementsDocker(string functionAppRoot, string packagesLocation, string additionalPackages)
{
// Configurable settings
var pythonDockerImageSetting = Environment.GetEnvironmentVariable(Constants.PythonDockerImageVersionSetting);
var dockerSkipPullFlagSetting = Environment.GetEnvironmentVariable(Constants.PythonDockerImageSkipPull);
var dockerRunSetting = Environment.GetEnvironmentVariable(Constants.PythonDockerRunCommand);
string dockerImage = pythonDockerImageSetting;
if (string.IsNullOrEmpty(dockerImage))
{
dockerImage = await ChoosePythonBuildEnvImage();
}
if (string.IsNullOrEmpty(dockerSkipPullFlagSetting) ||
!(dockerSkipPullFlagSetting.Equals("true", StringComparison.OrdinalIgnoreCase) || dockerSkipPullFlagSetting == "1"))
{
await DockerHelpers.DockerPull(dockerImage);
}
var containerId = string.Empty;
try
{
if (string.IsNullOrEmpty(dockerRunSetting))
{
containerId = await DockerHelpers.DockerRun(dockerImage, command: "sleep infinity");
}
else
{
(var output, _, _) = await DockerHelpers.RunDockerCommand(dockerRunSetting);
containerId = output.ToString().Trim();
}
await DockerHelpers.CopyToContainer(containerId, Constants.RequirementsTxt, $"/{Constants.RequirementsTxt}");
var scriptFilePath = Path.GetTempFileName();
await FileSystemHelpers.WriteAllTextToFileAsync(scriptFilePath, (await StaticResources.PythonDockerBuildScript).Replace("\r\n", "\n"));
if (!string.IsNullOrWhiteSpace(additionalPackages))
{
// Give the container time to start up
await Task.Delay(TimeSpan.FromSeconds(3));
await DockerHelpers.ExecInContainer(containerId, $"apt-get update");
await DockerHelpers.ExecInContainer(containerId, $"apt-get install -y {additionalPackages}");
}
await DockerHelpers.CopyToContainer(containerId, scriptFilePath, Constants.StaticResourcesNames.PythonDockerBuild);
await DockerHelpers.ExecInContainer(containerId, $"chmod +x /{Constants.StaticResourcesNames.PythonDockerBuild}");
await DockerHelpers.ExecInContainer(containerId, $"/{Constants.StaticResourcesNames.PythonDockerBuild}");
await DockerHelpers.CopyFromContainer(containerId, $"/{Constants.ExternalPythonPackages}/.", packagesLocation);
}
finally
{
if (!string.IsNullOrEmpty(containerId))
{
await DockerHelpers.KillContainer(containerId, ignoreError: true);
}
}
}