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/Environment.vb

284 lines
14 KiB

#Region "Microsoft.VisualBasic::2bc4c7a574db43f6df5da77e267ee513, CloudKit\Docker\Environment.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:
' Class Environment
'
' Properties: [Shared], container
'
' Constructor: (+1 Overloads) Sub New
' Function: CreateDockerCommand, (+2 Overloads) Mount
'
' Class DockerAppDriver
'
' Constructor: (+1 Overloads) Sub New
' Function: Shell
'
' /********************************************************************************/
#End Region
Imports System.Runtime.CompilerServices
Imports System.Text
Imports Darwinism.Docker.Arguments
Imports Microsoft.VisualBasic.CommandLine
Imports Microsoft.VisualBasic.Linq
''' <summary>
''' The container environment module for ``docker run ...``
''' </summary>
Public Class Environment
' Run a command in a new container
'
' Options:
' --add-host list Add a custom host-to-IP mapping
' (host:ip)
' -a, --attach list Attach to STDIN, STDOUT or STDERR
' --blkio-weight uint16 Block IO (relative weight),
' between 10 and 1000, or 0 to
' disable (default 0)
' --blkio-weight-device list Block IO weight (relative device
' weight) (default [])
' --cap-add list Add Linux capabilities
' --cap-drop list Drop Linux capabilities
' --cgroup-parent string Optional parent cgroup for the
' container
' --cidfile string Write the container ID to the file
' --cpu-period int Limit CPU CFS (Completely Fair
' Scheduler) period
' --cpu-quota int Limit CPU CFS (Completely Fair
' Scheduler) quota
' --cpu-rt-period int Limit CPU real-time period in
' microseconds
' --cpu-rt-runtime int Limit CPU real-time runtime in
' microseconds
' -c, --cpu-shares int CPU shares (relative weight)
' --cpus decimal Number of CPUs
' --cpuset-cpus string CPUs in which to allow execution
' (0-3, 0,1)
' --cpuset-mems string MEMs in which to allow execution
' (0-3, 0,1)
' -d, --detach Run container in background and
' print container ID
' --detach-keys string Override the key sequence for
' detaching a container
' --device list Add a host device to the container
' --device-cgroup-rule list Add a rule to the cgroup allowed
' devices list
' --device-read-bps list Limit read rate (bytes per second)
' from a device (default [])
' --device-read-iops list Limit read rate (IO per second)
' from a device (default [])
' --device-write-bps list Limit write rate (bytes per
' second) to a device (default [])
' --device-write-iops list Limit write rate (IO per second)
' to a device (default [])
' --disable-content-trust Skip image verification (default true)
' --dns list Set custom DNS servers
' --dns-option list Set DNS options
' --dns-search list Set custom DNS search domains
' --entrypoint string Overwrite the default ENTRYPOINT
' of the image
' -e, --env list Set environment variables
' --env-file list Read in a file of environment variables
' --expose list Expose a port or a range of ports
' --group-add list Add additional groups to join
' --health-cmd string Command to run to check health
' --health-interval duration Time between running the check
' (ms|s|m|h) (default 0s)
' --health-retries int Consecutive failures needed to
' report unhealthy
' --health-start-period duration Start period for the container to
' initialize before starting
' health-retries countdown
' (ms|s|m|h) (default 0s)
' --health-timeout duration Maximum time to allow one check to
' run (ms|s|m|h) (default 0s)
' --help Print usage
' -h, --hostname string Container host name
' --init Run an init inside the container
' that forwards signals and reaps
' processes
' -i, --interactive Keep STDIN open even if not attached
' --ip string IPv4 address (e.g., 172.30.100.104)
' --ip6 string IPv6 address (e.g., 2001:db8::33)
' --ipc string IPC mode to use
' --isolation string Container isolation technology
' --kernel-memory bytes Kernel memory limit
' -l, --label list Set meta data on a container
' --label-file list Read in a line delimited file of labels
' --link list Add link to another container
' --link-local-ip list Container IPv4/IPv6 link-local
' addresses
' --log-driver string Logging driver for the container
' --log-opt list Log driver options
' --mac-address string Container MAC address (e.g.,
' 92:d0:c6:0a:29:33)
' -m, --memory bytes Memory limit
' --memory-reservation bytes Memory soft limit
' --memory-swap bytes Swap limit equal to memory plus
' swap: '-1' to enable unlimited swap
' --memory-swappiness int Tune container memory swappiness
' (0 to 100) (default -1)
' --mount mount Attach a filesystem mount to the
' container
' --name string Assign a name to the container
' --network string Connect a container to a network
' (default "default")
' --network-alias list Add network-scoped alias for the
' container
' --no-healthcheck Disable any container-specified
' HEALTHCHECK
' --oom-kill-disable Disable OOM Killer
' --oom-score-adj int Tune host's OOM preferences (-1000
' to 1000)
' --pid string PID namespace to use
' --pids-limit int Tune container pids limit (set -1
' for unlimited)
' --privileged Give extended privileges to this
' container
' -p, --publish list Publish a container's port(s) to
' the host
' -P, --publish-all Publish all exposed ports to
' random ports
' --read-only Mount the container's root
' filesystem as read only
' --restart string Restart policy to apply when a
' container exits (default "no")
' --rm Automatically remove the container
' when it exits
' --runtime string Runtime to use for this container
' --security-opt list Security Options
' --shm-size bytes Size of /dev/shm
' --sig-proxy Proxy received signals to the
' process (default true)
' --stop-signal string Signal to stop a container
' (default "15")
' --stop-timeout int Timeout (in seconds) to stop a
' container
' --storage-opt list Storage driver options for the
' container
' --sysctl map Sysctl options (default map[])
' --tmpfs list Mount a tmpfs directory
' -t, --tty Allocate a pseudo-TTY
' --ulimit ulimit Ulimit options (default [])
' -u, --user string Username or UID (format:
' <name|uid>[:<group|gid>])
' --userns string User namespace to use
' --uts string UTS namespace to use
' -v, --volume list Bind mount a volume
' --volume-driver string Optional volume driver for the
' container
' --volumes-from list Mount volumes from the specified
' container(s)
' -w, --workdir string Working directory inside the container
Public ReadOnly Property [Shared] As Mount()
Public ReadOnly Property container As Image
Sub New(container As Image)
Me.container = container
End Sub
Public Function Mount(local$, virtual$) As Environment
_Shared = _Shared.JoinIterates(New Mount With {.local = local, .virtual = virtual}).ToArray
Return Me
End Function
Public Function Mount(ParamArray [shared] As Mount()) As Environment
_Shared = [shared]
Return Me
End Function
Const InvalidMount$ = "Shared Drive argument is presented, but value is invalid, -v option will be ignored!"
''' <summary>
''' Create a docker run command for running command ``app arguments``
''' </summary>
''' <param name="command">``app arguments``</param>
''' <param name="workdir">Working directory inside the container</param>
''' <param name="portForward">Publish a container's port(s) to the host</param>
''' <returns>
''' docker run xxx
''' </returns>
Public Function CreateDockerCommand(command$, Optional workdir$ = Nothing, Optional portForward As PortForward = Nothing) As String
Dim options As New StringBuilder
If Not [Shared] Is Nothing Then
For Each map As Mount In [Shared]
If map.IsValid Then
Call options.AppendLine($"-v {map}")
Else
Call InvalidMount.Warning
End If
Next
End If
If Not workdir.StringEmpty Then
Call options.AppendLine($"--workdir=""{workdir}""")
End If
If Not portForward Is Nothing Then
Call options.AppendLine($"-p {portForward}")
End If
Return $"run {options} {container} {command}"
End Function
End Class
''' <summary>
''' 通过这个模块来运行某一个Docker container之中的命令行命令
''' </summary>
Public Class DockerAppDriver
ReadOnly docker As Environment
ReadOnly appHome$
ReadOnly appName$
''' <summary>
'''
''' </summary>
''' <param name="container">Docker容器的``image ID``</param>
''' <param name="app">可执行文件的文件名</param>
''' <param name="mount"></param>
''' <param name="home">应用程序的文件夹目录路径</param>
Sub New(container As Image, app$, Optional mount As Mount = Nothing, Optional home$ = Nothing)
docker = New Environment(container).Mount(mount)
appHome = home
appName = app
End Sub
<MethodImpl(MethodImplOptions.AggressiveInlining)>
Public Function Shell(args$, Optional workdir$ = Nothing) As String
Return Commands.shell("docker", docker.CreateDockerCommand($"{appHome}/{appName} {args}", workdir:=workdir))
End Function
End Class