Add support for external XFS volume

Update dind dockerfile and remove unnecessary stuff
This commit is contained in:
Marcos Lilljedahl
2017-10-02 13:05:03 -03:00
parent 1a7a776a27
commit 2103175af5
3 changed files with 43 additions and 24 deletions

View File

@@ -21,8 +21,8 @@ const (
var NameFilter = regexp.MustCompile(PWDHostPortGroupRegex) var NameFilter = regexp.MustCompile(PWDHostPortGroupRegex)
var AliasFilter = regexp.MustCompile(AliasPortGroupRegex) var AliasFilter = regexp.MustCompile(AliasPortGroupRegex)
var PortNumber, Key, Cert, SessionsFile, PWDContainerName, L2ContainerName, L2Subdomain, PWDCName, HashKey, SSHKeyPath, L2RouterIP string var PortNumber, Key, Cert, SessionsFile, PWDContainerName, L2ContainerName, L2Subdomain, PWDCName, HashKey, SSHKeyPath, L2RouterIP, DindVolumeSize string
var UseLetsEncrypt bool var UseLetsEncrypt, ExternalDindVolume bool
var LetsEncryptCertsDir string var LetsEncryptCertsDir string
var LetsEncryptDomains stringslice var LetsEncryptDomains stringslice
var MaxLoadAvg float64 var MaxLoadAvg float64
@@ -53,6 +53,8 @@ func ParseFlags() {
flag.StringVar(&L2Subdomain, "l2-subdomain", "direct", "Subdomain to the L2 Router") flag.StringVar(&L2Subdomain, "l2-subdomain", "direct", "Subdomain to the L2 Router")
flag.StringVar(&PWDCName, "cname", "", "CNAME given to this host") flag.StringVar(&PWDCName, "cname", "", "CNAME given to this host")
flag.StringVar(&HashKey, "hash_key", "salmonrosado", "Hash key to use for cookies") flag.StringVar(&HashKey, "hash_key", "salmonrosado", "Hash key to use for cookies")
flag.StringVar(&DindVolumeSize, "dind-volume-size", "5G", "Dind volume folder size")
flag.BoolVar(&ExternalDindVolume, "external-dind-volume", false, "Use external dind volume")
flag.Float64Var(&MaxLoadAvg, "maxload", 100, "Maximum allowed load average before failing ping requests") flag.Float64Var(&MaxLoadAvg, "maxload", 100, "Maximum allowed load average before failing ping requests")
flag.StringVar(&SSHKeyPath, "ssh_key_path", "", "SSH Private Key to use") flag.StringVar(&SSHKeyPath, "ssh_key_path", "", "SSH Private Key to use")
flag.Parse() flag.Parse()

View File

@@ -19,8 +19,10 @@ import (
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/network"
"github.com/docker/docker/api/types/swarm" "github.com/docker/docker/api/types/swarm"
"github.com/docker/docker/api/types/volume"
"github.com/docker/docker/client" "github.com/docker/docker/client"
"github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/jsonmessage"
"github.com/play-with-docker/play-with-docker/config"
) )
const ( const (
@@ -239,7 +241,7 @@ type CreateContainerOpts struct {
Networks []string Networks []string
} }
func (d *docker) CreateContainer(opts CreateContainerOpts) error { func (d *docker) CreateContainer(opts CreateContainerOpts) (err error) {
// Make sure directories are available for the new instance container // Make sure directories are available for the new instance container
containerDir := "/var/run/pwd" containerDir := "/var/run/pwd"
containerCertDir := fmt.Sprintf("%s/certs", containerDir) containerCertDir := fmt.Sprintf("%s/certs", containerDir)
@@ -268,7 +270,6 @@ func (d *docker) CreateContainer(opts CreateContainerOpts) error {
NetworkMode: container.NetworkMode(opts.SessionId), NetworkMode: container.NetworkMode(opts.SessionId),
Privileged: opts.Privileged, Privileged: opts.Privileged,
AutoRemove: true, AutoRemove: true,
//PublishAllPorts: true,
LogConfig: container.LogConfig{Config: map[string]string{"max-size": "10m", "max-file": "1"}}, LogConfig: container.LogConfig{Config: map[string]string{"max-size": "10m", "max-file": "1"}},
} }
@@ -315,49 +316,69 @@ func (d *docker) CreateContainer(opts CreateContainerOpts) error {
EndpointsConfig: map[string]*network.EndpointSettings{opts.Networks[0]: &network.EndpointSettings{}}, EndpointsConfig: map[string]*network.EndpointSettings{opts.Networks[0]: &network.EndpointSettings{}},
} }
if config.ExternalDindVolume {
_, err = d.c.VolumeCreate(context.Background(), volume.VolumesCreateBody{
Driver: "xfsvol",
DriverOpts: map[string]string{
"size": config.DindVolumeSize,
},
Name: opts.SessionId,
})
if err != nil {
return
}
h.Binds = []string{fmt.Sprintf("%s:/var/lib/docker", opts.SessionId)}
defer func() {
if err != nil {
d.c.VolumeRemove(context.Background(), opts.SessionId, true)
}
}()
}
container, err := d.c.ContainerCreate(context.Background(), cf, h, networkConf, opts.ContainerName) container, err := d.c.ContainerCreate(context.Background(), cf, h, networkConf, opts.ContainerName)
if err != nil { if err != nil {
if client.IsErrImageNotFound(err) { if client.IsErrImageNotFound(err) {
log.Printf("Unable to find image '%s' locally\n", opts.Image) log.Printf("Unable to find image '%s' locally\n", opts.Image)
if err = d.pullImage(context.Background(), opts.Image); err != nil { if err = d.pullImage(context.Background(), opts.Image); err != nil {
return err return
} }
container, err = d.c.ContainerCreate(context.Background(), cf, h, networkConf, opts.ContainerName) container, err = d.c.ContainerCreate(context.Background(), cf, h, networkConf, opts.ContainerName)
if err != nil { if err != nil {
return err return
} }
} else { } else {
return err return
} }
} }
//connect remaining networks if there are any //connect remaining networks if there are any
if len(opts.Networks) > 1 { if len(opts.Networks) > 1 {
for _, nid := range opts.Networks { for _, nid := range opts.Networks {
err := d.c.NetworkConnect(context.Background(), nid, container.ID, &network.EndpointSettings{}) err = d.c.NetworkConnect(context.Background(), nid, container.ID, &network.EndpointSettings{})
if err != nil { if err != nil {
return err return
} }
} }
} }
if err := d.copyIfSet(opts.ServerCert, "cert.pem", containerCertDir, opts.ContainerName); err != nil { if err = d.copyIfSet(opts.ServerCert, "cert.pem", containerCertDir, opts.ContainerName); err != nil {
return err return
} }
if err := d.copyIfSet(opts.ServerKey, "key.pem", containerCertDir, opts.ContainerName); err != nil { if err = d.copyIfSet(opts.ServerKey, "key.pem", containerCertDir, opts.ContainerName); err != nil {
return err return
} }
if err := d.copyIfSet(opts.CACert, "ca.pem", containerCertDir, opts.ContainerName); err != nil { if err = d.copyIfSet(opts.CACert, "ca.pem", containerCertDir, opts.ContainerName); err != nil {
return err return
} }
err = d.c.ContainerStart(context.Background(), container.ID, types.ContainerStartOptions{}) err = d.c.ContainerStart(context.Background(), container.ID, types.ContainerStartOptions{})
if err != nil { if err != nil {
return err return
} }
return nil return
} }
func (d *docker) GetContainerIPs(id string) (map[string]string, error) { func (d *docker) GetContainerIPs(id string) (map[string]string, error) {

View File

@@ -1,7 +1,7 @@
ARG VERSION=docker:17.07-dind ARG VERSION=docker:17-dind
FROM ${VERSION} FROM ${VERSION}
RUN apk add --no-cache git tmux py2-pip apache2-utils vim build-base gettext-dev curl bash-completion bash util-linux jq openssh zfs RUN apk add --no-cache git tmux py2-pip apache2-utils vim build-base gettext-dev curl bash-completion bash util-linux jq openssh
ENV GOPATH /root/go ENV GOPATH /root/go
ENV PATH $PATH:$GOPATH ENV PATH $PATH:$GOPATH
@@ -37,9 +37,6 @@ COPY [".vimrc",".profile", ".inputrc", ".gitconfig", "./root/"]
COPY ["motd", "/etc/motd"] COPY ["motd", "/etc/motd"]
COPY ["daemon.json", "/etc/docker/"] COPY ["daemon.json", "/etc/docker/"]
ARG docker_storage_driver=overlay2
ENV DOCKER_STORAGE_DRIVER=$docker_storage_driver
# Move to our home # Move to our home
WORKDIR /root WORKDIR /root
@@ -53,7 +50,6 @@ RUN mkdir -p /var/run/pwd/certs && mkdir -p /var/run/pwd/uploads \
# Remove IPv6 alias for localhost and start docker in the background ... # Remove IPv6 alias for localhost and start docker in the background ...
CMD cat /etc/hosts >/etc/hosts.bak && \ CMD cat /etc/hosts >/etc/hosts.bak && \
sed 's/^::1.*//' /etc/hosts.bak > /etc/hosts && \ sed 's/^::1.*//' /etc/hosts.bak > /etc/hosts && \
sed -i "s/\DOCKER_STORAGE_DRIVER/$DOCKER_STORAGE_DRIVER/" /etc/docker/daemon.json && \
sed -i "s/\PWD_IP_ADDRESS/$PWD_IP_ADDRESS/" /etc/docker/daemon.json && \ sed -i "s/\PWD_IP_ADDRESS/$PWD_IP_ADDRESS/" /etc/docker/daemon.json && \
sed -i "s/\DOCKER_TLSENABLE/$DOCKER_TLSENABLE/" /etc/docker/daemon.json && \ sed -i "s/\DOCKER_TLSENABLE/$DOCKER_TLSENABLE/" /etc/docker/daemon.json && \
sed -i "s/\DOCKER_TLSCACERT/$DOCKER_TLSCACERT/" /etc/docker/daemon.json && \ sed -i "s/\DOCKER_TLSCACERT/$DOCKER_TLSCACERT/" /etc/docker/daemon.json && \