You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Darwinism/CloudKit/Docker/Commands.vb

243 lines
9.6 KiB

#Region "Microsoft.VisualBasic::ffc19cddc95f25b000eaefc28a5f74a7, CloudKit\Docker\Commands.vb"
' Author:
'
' asuka (amethyst.asuka@gcmodeller.org)
' xie (genetics@smrucc.org)
' xieguigang (xie.guigang@live.com)
'
' Copyright (c) 2018 GPL3 Licensed
'
'
' GNU GENERAL PUBLIC LICENSE (GPL3)
'
'
' This program is free software: you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation, either version 3 of the License, or
' (at your option) any later version.
'
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' GNU General Public License for more details.
'
' You should have received a copy of the GNU General Public License
' along with this program. If not, see <http://www.gnu.org/licenses/>.
' /********************************************************************************/
' Summaries:
' Module Commands
'
' Function: CommandHistory, PS, rmi, Run, Search
'
' Sub: [Stop]
'
' /********************************************************************************/
#End Region
Imports System.Runtime.CompilerServices
Imports Darwinism.Docker.Arguments
Imports Darwinism.Docker.Captures
Imports Microsoft.VisualBasic.CommandLine.Reflection
Imports Microsoft.VisualBasic.Language
Imports Microsoft.VisualBasic.Scripting.MetaData
Imports SMRUCC.Rsharp.Runtime.Interop
''' <summary>
''' Docker commands
''' </summary>
'''
<Package("docker", Category:=APICategories.SoftwareTools, Publisher:="xie.guigang@live.com")>
<RTypeExport("image", GetType(Image))>
<RTypeExport("mount", GetType(Mount))>
Public Module Commands
' PS C:\Users\lipidsearch> docker
' Usage: docker [OPTIONS] COMMAND
' A self-sufficient runtime for containers
' Options:
' --config string Location of client config files (default "C:\\Users\\lipidsearch\\.docker")
' -D, --debug Enable debug mode
' -H, --host list Daemon socket(s) to connect to
' -l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
' --tls Use TLS; implied by --tlsverify
' --tlscacert string Trust certs signed only by this CA (default "C:\\Users\\lipidsearch\\.docker\\ca.pem")
' --tlscert string Path to TLS certificate file (default "C:\\Users\\lipidsearch\\.docker\\cert.pem")
' --tlskey string Path to TLS key file (default "C:\\Users\\lipidsearch\\.docker\\key.pem")
' --tlsverify Use TLS and verify the remote
' -v, --version Print version information and quit
' Management Commands:
' builder Manage builds
' config Manage Docker configs
' container Manage containers
' image Manage images
' network Manage networks
' node Manage Swarm nodes
' plugin Manage plugins
' secret Manage Docker secrets
' service Manage services
' stack Manage Docker stacks
' swarm Manage Swarm
' system Manage Docker
' trust Manage trust on Docker images
' volume Manage volumes
' Commands:
' attach Attach local standard input, output, and error streams to a running container
' build Build an image from a Dockerfile
' commit Create a new image from a container's changes
' cp Copy files/folders between a container and the local filesystem
' create Create a new container
' diff Inspect changes to files or directories on a container's filesystem
' events Get real time events from the server
' exec Run a command in a running container
' export Export a container's filesystem as a tar archive
' history Show the history of an image
' images List images
' import Import the contents from a tarball to create a filesystem image
' info Display system-wide information
' inspect Return low-level information on Docker objects
' kill Kill one or more running containers
' load Load an image from a tar archive or STDIN
' login Log in to a Docker registry
' logout Log out from a Docker registry
' logs Fetch the logs of a container
' pause Pause all processes within one or more containers
' port List port mappings or a specific mapping for the container
' ps List containers
' pull Pull an image or a repository from a registry
' push Push an image or a repository to a registry
' rename Rename a container
' restart Restart one or more containers
' rm Remove one or more containers
' rmi Remove one or more images
' run Run a command in a new container
' save Save one or more images to a tar archive (streamed to STDOUT by default)
' search Search the Docker Hub for images
' start Start one or more stopped containers
' stats Display a live stream of container(s) resource usage statistics
' stop Stop one or more running containers
' tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
' top Display the running processes of a container
' unpause Unpause all processes within one or more containers
' update Update configuration of one or more containers
' version Show the Docker version information
' wait Block until one or more containers stop, then print their exit codes
' Run 'docker COMMAND --help' for more information on a command.
ReadOnly powershell As New PowerShell
Public Iterator Function CommandHistory() As IEnumerable(Of String)
For Each line As String In powershell.logs
Yield line
Next
End Function
''' <summary>
''' Search the Docker Hub for images
''' </summary>
''' <param name="term"></param>
''' <returns></returns>
'''
<ExportAPI("search")>
Public Function Search(term As String) As IEnumerable(Of Search)
Return powershell($"docker search {term}") _
.ParseTable(Function(tokens)
Return New Search With {
.NAME = Image.ParseEntry(tokens(0)),
.DESCRIPTION = tokens(1).Trim,
.STARS = tokens(2).Trim,
.OFFICIAL = tokens(3).Trim,
.AUTOMATED = tokens(4).Trim
}
End Function)
End Function
''' <summary>
''' List containers
''' </summary>
''' <returns></returns>
'''
<ExportAPI("ps")>
Public Function PS() As IEnumerable(Of Container)
Return powershell("docker ps") _
.ParseTable(Function(tokens)
Return New Container With {
.CONTAINER_ID = tokens(0).Trim,
.IMAGE = Image.ParseEntry(tokens(1)),
.COMMAND = tokens(2).Trim,
.CREATED = tokens(3).Trim,
.STATUS = tokens(4).Trim,
.PORTS = tokens(5),
.NAMES = tokens(6).Trim
}
End Function)
End Function
''' <summary>
''' Stop one or more running containers
''' </summary>
''' <param name="containers"></param>
'''
<ExportAPI("stop")>
Public Sub [Stop](ParamArray containers As String())
For Each id As String In containers
Call powershell.RunScript($"docker stop {id}")
Next
End Sub
''' <summary>
''' Run a command in a new container.(这个函数会捕捉到命令的标准输出然后以字符串的形式返回)
''' </summary>
''' <param name="command"></param>
''' <remarks>
''' 这个方法能够自定义的参数比较有限,如果需要更加复杂的使用方法,可以使用<see cref="Environment"/>对象
''' </remarks>
'''
<MethodImpl(MethodImplOptions.AggressiveInlining)>
<Extension>
<ExportAPI("run")>
Public Function Run(container As Image, command$,
Optional workdir As String = Nothing,
Optional mount As Mount() = Nothing,
Optional portForward As PortForward = Nothing) As String
Dim cli As String = New Environment(container) _
.Mount(mount) _
.CreateDockerCommand(command, workdir, portForward)
Return powershell(cli)
End Function
''' <summary>
''' delete docker images and related containers
''' </summary>
''' <returns></returns>
'''
<ExportAPI("rmImage")>
Public Function rmi(imageId As String) As Boolean
Dim stdout As Value(Of String) = ""
Dim containerId As String
Do While (stdout = CommandLine.Call("docker", $"rmi {imageId}")).Contains("image is being used by stopped container")
containerId = Strings.Split(Trim(stdout)).Last
Call CommandLine.Call("docker", $"rm {containerId}")
Call Console.WriteLine($"remove container {containerId}")
Loop
Return True
End Function
End Module