Skip to content

Commit 0bddd00

Browse files
authored
Merge pull request #38 from k-kinzal/add-docker-binary-donloader
Add downloader for docker binary
2 parents 943b7df + 5293f3f commit 0bddd00

File tree

18 files changed

+134
-20
lines changed

18 files changed

+134
-20
lines changed

.circleci/config.yml

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,9 @@ jobs:
3535
steps:
3636
- attach_workspace:
3737
at: ./
38-
- run:
39-
# FIXME: host: ubuntu, guest: alpine not working
40-
# https://twitter.com/amaya382/status/1077874567119396864
41-
# https://amaya382.hatenablog.jp/entry/2016/10/05/030254
42-
name: Download docker binary
43-
command: |
44-
mkdir -p bin
45-
docker run -v $PWD/bin:/tmp/bin docker /bin/sh -c 'cp $(which docker) /tmp/bin'
4638
- run:
4739
name: Integration Test
4840
command: |
49-
echo 'export PATH='$PWD'/bin:$PATH' >> $BASH_ENV
50-
source $BASH_ENV
5141
find test/integration/*/test.sh | xargs -I{} /bin/sh -c "{} || exit 255 && echo pass {}"
5242
5343
workflows:

.golangci.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ run:
1616

1717
issues:
1818
exclude:
19-
- "`aliases.Schema` composite literal uses unkeyed fields"
19+
- "`aliases.Schema` composite literal uses unkeyed fields"
20+
- "`aliases.BinarySchema` composite literal uses unkeyed fields"

cmd/run.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ func (ctx *runContext) GetCommandShema() *aliases.Schema {
4444
schema := aliases.Schema{
4545
index,
4646
path.Base(index),
47+
aliases.BinarySchema{"", ""},
4748
nil,
4849
flags.bool("detach", "d"),
4950
flags.bool("sig-proxy"),

pkg/aliases/binary.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package aliases
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"os/exec"
7+
"path"
8+
"strings"
9+
)
10+
11+
type BinaryManager struct {
12+
binaryDir string
13+
}
14+
15+
func (manager *BinaryManager) getFilename(image string, tag string) string {
16+
filename := fmt.Sprintf("%s:%s", image, tag)
17+
filename = strings.Replace(filename, "/", "-", -1)
18+
filename = strings.Replace(filename, ":", "-", -1)
19+
filename = strings.Replace(filename, ".", "-", -1)
20+
filename = strings.Replace(filename, "_", "-", -1)
21+
22+
return filename
23+
}
24+
25+
func (manager *BinaryManager) exists(image string, tag string) bool {
26+
filename := manager.getFilename(image, tag)
27+
filepath := path.Join(manager.binaryDir, filename)
28+
29+
if _, err := os.Stat(filepath); os.IsNotExist(err) {
30+
return false
31+
}
32+
33+
return true
34+
}
35+
36+
func (manager *BinaryManager) download(image string, tag string) error {
37+
filename := manager.getFilename(image, tag)
38+
39+
cmd := exec.Command(
40+
"docker",
41+
"run",
42+
"-v",
43+
fmt.Sprintf("%s:%s", manager.binaryDir, "/data"),
44+
fmt.Sprintf("%s:%s", image, tag),
45+
"sh",
46+
"-c",
47+
fmt.Sprintf("cp $(which docker) /data/%s", filename),
48+
)
49+
cmd.Stderr = os.Stderr
50+
51+
if err := cmd.Run(); err != nil {
52+
return err
53+
}
54+
55+
return nil
56+
}
57+
58+
func (manager *BinaryManager) Get(image string, tag string) (*string, error) {
59+
if !manager.exists(image, tag) {
60+
if err := manager.download(image, tag); err != nil {
61+
return nil, fmt.Errorf("runtime error: %s", err)
62+
}
63+
}
64+
65+
filepath := path.Join(manager.binaryDir, manager.getFilename(image, tag))
66+
67+
return &filepath, nil
68+
}

pkg/aliases/command.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,12 @@ func NewCommand(ctx Context, schema Schema) (*posix.Cmd, error) {
336336
cmd.Args = append(cmd.Args, "--volume", strconv.Quote(v))
337337
}
338338
if (len(schema.Dependencies) > 0) && ctx.HasDockerSocket() {
339-
cmd.Args = append(cmd.Args, "--volume", strconv.Quote(fmt.Sprintf("%s:/usr/local/bin/docker", ctx.DockerBinaryPath())))
339+
binary := BinaryManager{path.Join(ctx.HomePath(), "docker")}
340+
binarypath, err := binary.Get(schema.Docker.Image, schema.Docker.Tag)
341+
if err != nil {
342+
return nil, err
343+
}
344+
cmd.Args = append(cmd.Args, "--volume", strconv.Quote(fmt.Sprintf("%s:/usr/local/bin/docker", *binarypath)))
340345
if sock := ctx.DockerSocketPath(); sock != nil {
341346
cmd.Args = append(cmd.Args, "--volume", strconv.Quote(fmt.Sprintf("%s:/var/run/docker.sock", *sock)))
342347
}

pkg/aliases/schema.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package aliases
22

3+
type BinarySchema struct {
4+
Image string `yaml:"image" validate:"required" default:"docker"`
5+
Tag string `yaml:"tag" validate:"required" default:"18.09.0"`
6+
}
7+
38
type Schema struct {
49
// aliases configuration
510
Path string
611
FileName string
7-
Dependencies []string `yaml:"dependencies"`
12+
Docker BinarySchema `yaml:"docker"`
13+
Dependencies []string `yaml:"dependencies"`
814
// docker run options
915
Detach *string `yaml:"detach" validate:"omitempty,bool|script"`
1016
SigProxy *string `yaml:"sigProxy" validate:"omitempty,bool|script"`
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
alias alpine='docker run --env ALIASES_PWD="${ALIASES_PWD:-$PWD}" --interactive --network "host" --privileged --rm $(test "$(if tty >/dev/null; then echo true; else echo false; fi)" = "true" && echo "--tty") --volume "[DOCKER]:/usr/local/bin/docker" --volume "/var/run/docker.sock:/var/run/docker.sock" --volume "[TEMP_DIR]/kubectl:/usr/local/bin/kubectl" alpine:${ALPINE_VERSION:-"3.8"}'
1+
alias alpine='docker run --env ALIASES_PWD="${ALIASES_PWD:-$PWD}" --interactive --network "host" --privileged --rm $(test "$(if tty >/dev/null; then echo true; else echo false; fi)" = "true" && echo "--tty") --volume "[HOME]/.aliases/docker/docker-18-09-0:/usr/local/bin/docker" --volume "/var/run/docker.sock:/var/run/docker.sock" --volume "[TEMP_DIR]/kubectl:/usr/local/bin/kubectl" alpine:${ALPINE_VERSION:-"3.8"}'
22
alias kubectl='docker run --interactive --network "host" --rm $(test "$(if tty >/dev/null; then echo true; else echo false; fi)" = "true" && echo "--tty") --volume "[HOME]/.kube:/root/.kube" --volume "${ALIASES_PWD:-$PWD}:/kube" --workdir "/kube" chatwork/kubectl:${KUBECTL_VERSION:-"1.11.2"}'
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#!/bin/sh
22

33
if [ -p /dev/stdin ]; then
4-
cat - | docker run --env ALIASES_PWD="${ALIASES_PWD:-$PWD}" --interactive --network "host" --privileged --rm $(test "$(if tty >/dev/null; then echo true; else echo false; fi)" = "true" && echo "--tty") --volume "[DOCKER]:/usr/local/bin/docker" --volume "/var/run/docker.sock:/var/run/docker.sock" --volume "[TEMP_DIR]/kubectl:/usr/local/bin/kubectl" alpine:${ALPINE_VERSION:-"3.8"} "$@"
4+
cat - | docker run --env ALIASES_PWD="${ALIASES_PWD:-$PWD}" --interactive --network "host" --privileged --rm $(test "$(if tty >/dev/null; then echo true; else echo false; fi)" = "true" && echo "--tty") --volume "[HOME]/.aliases/docker/docker-18-09-0:/usr/local/bin/docker" --volume "/var/run/docker.sock:/var/run/docker.sock" --volume "[TEMP_DIR]/kubectl:/usr/local/bin/kubectl" alpine:${ALPINE_VERSION:-"3.8"} "$@"
55
exit $?
66
else
7-
docker run --env ALIASES_PWD="${ALIASES_PWD:-$PWD}" --interactive --network "host" --privileged --rm $(test "$(if tty >/dev/null; then echo true; else echo false; fi)" = "true" && echo "--tty") --volume "[DOCKER]:/usr/local/bin/docker" --volume "/var/run/docker.sock:/var/run/docker.sock" --volume "[TEMP_DIR]/kubectl:/usr/local/bin/kubectl" alpine:${ALPINE_VERSION:-"3.8"} "$@"
7+
docker run --env ALIASES_PWD="${ALIASES_PWD:-$PWD}" --interactive --network "host" --privileged --rm $(test "$(if tty >/dev/null; then echo true; else echo false; fi)" = "true" && echo "--tty") --volume "[HOME]/.aliases/docker/docker-18-09-0:/usr/local/bin/docker" --volume "/var/run/docker.sock:/var/run/docker.sock" --volume "[TEMP_DIR]/kubectl:/usr/local/bin/kubectl" alpine:${ALPINE_VERSION:-"3.8"} "$@"
88
exit $?
99
fi

test/integration/dependencies/test.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ TEST_DIR="$(cd "$(dirname "${0}")"; echo "$(pwd)")"
77

88
ALIASES=$(cd "${TEST_DIR}/../../..//dist"; echo "$(pwd)/aliases -c ${TEST_DIR}/aliases.yaml")
99
DIFF=$(if which colordiff >/dev/null; then echo "colordiff -Buw --strip-trailing-cr"; else echo "diff -Bw"; fi)
10-
MASK="sed -e s|$(which docker):|[DOCKER]:|g -e s|${HOME}|[HOME]|g -e s|${TEMP_DIR}|[TEMP_DIR]|g -e s|[0-9]*-[0-9]*-[0-9]*T[0-9]*:[0-9]*:[0-9]*Z|yyyy-mm-ddThh:MM:ssZ|g"
10+
MASK="sed -e s|${HOME}|[HOME]|g -e s|${TEMP_DIR}|[TEMP_DIR]|g -e s|[0-9]*-[0-9]*-[0-9]*T[0-9]*:[0-9]*:[0-9]*Z|yyyy-mm-ddThh:MM:ssZ|g"
1111

1212
${ALIASES} gen --export-path "${TEMP_DIR}" | ${MASK} | sort | ${DIFF} ${TEST_DIR}/alias -
1313
${ALIASES} gen --export --export-path "${TEMP_DIR}" | ${MASK} | ${DIFF} ${TEST_DIR}/export -
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
alias kubectl='docker run --interactive --network "host" --rm $(test "$(if tty >/dev/null; then echo true; else echo false; fi)" = "true" && echo "--tty") --volume "[HOME]/.kube:/root/.kube" --volume "${ALIASES_PWD:-$PWD}:/kube" --workdir "/kube" chatwork/kubectl:${KUBECTL_VERSION:-"1.11.2"}'
2+
alias ubuntu='docker run --env ALIASES_PWD="${ALIASES_PWD:-$PWD}" --interactive --network "host" --privileged --rm $(test "$(if tty >/dev/null; then echo true; else echo false; fi)" = "true" && echo "--tty") --volume "[HOME]/.aliases/docker/docker-18-09-0:/usr/local/bin/docker" --volume "/var/run/docker.sock:/var/run/docker.sock" --volume "[TEMP_DIR]/kubectl:/usr/local/bin/kubectl" amd64/ubuntu:${UBUNTU_VERSION:-"19.04"}'

0 commit comments

Comments
 (0)