Fix 'balena build --emulated' on Windows (including default docker socket)

Change-type: patch
Signed-off-by: Paulo Castro <paulo@balena.io>
This commit is contained in:
Paulo Castro 2019-10-07 02:25:18 +01:00
parent 63fe3d41cc
commit 7dd33adfd1
7 changed files with 116 additions and 50 deletions

View File

@ -1636,7 +1636,8 @@ Examples:
$ balena build ./source/
$ balena build --deviceType raspberrypi3 --arch armv7hf --emulated
$ balena build --application MyApp ./source/
$ balena build --docker '/var/run/docker.sock'
$ balena build --docker /var/run/docker.sock # Linux, Mac
$ balena build --docker //./pipe/docker_engine # Windows
$ balena build --dockerHost my.docker.host --dockerPort 2376 --ca ca.pem --key key.pem --cert cert.pem
### Options

View File

@ -75,7 +75,8 @@ module.exports =
$ balena build ./source/
$ balena build --deviceType raspberrypi3 --arch armv7hf --emulated
$ balena build --application MyApp ./source/
$ balena build --docker '/var/run/docker.sock'
$ balena build --docker /var/run/docker.sock # Linux, Mac
$ balena build --docker //./pipe/docker_engine # Windows
$ balena build --dockerHost my.docker.host --dockerPort 2376 --ca ca.pem --key key.pem --cert cert.pem
"""
options: dockerUtils.appendOptions compose.appendOptions [

View File

@ -245,6 +245,7 @@ exports.buildProject = (
transpose.transposeTarStream task.buildStream,
hostQemuPath: toPosixPath(binPath)
containerQemuPath: "/tmp/#{qemu.QEMU_BIN_NAME}"
qemuFileMode: 0o555
.then (stream) ->
task.buildStream = stream
.return([ task, binPath ])

View File

@ -96,7 +96,6 @@ exports.appendOptions = (opts) ->
]
generateConnectOpts = (opts) ->
buildDockerodeOpts = require('dockerode-options')
fs = require('mz/fs')
_ = require('lodash')
@ -114,12 +113,12 @@ generateConnectOpts = (opts) ->
else if opts.docker? and opts.dockerHost?
# Both provided, no obvious way to continue
throw new Error("Both a local docker socket and docker host have been provided. Don't know how to continue.")
else if process.env.DOCKER_HOST
# If no explicit options are provided, use the env
connectOpts = buildDockerodeOpts(process.env.DOCKER_HOST)
else
# No options anywhere, assume default docker local socket
connectOpts.socketPath = '/var/run/docker.sock'
# Use docker-modem defaults which take the DOCKER_HOST env var into account
# https://github.com/apocas/docker-modem/blob/v2.0.2/lib/modem.js#L16-L65
Modem = require('docker-modem')
defaultOpts = new Modem()
connectOpts[opt] = defaultOpts[opt] for opt in ['host', 'port', 'socketPath']
# Now need to check if the user wants to connect over TLS
# to the host
@ -194,7 +193,17 @@ getDockerToolbelt = _.once ->
#
exports.createClient = createClient = (opts) ->
Docker = getDockerToolbelt()
return new Docker(opts)
docker = new Docker(opts)
modem = docker.modem
# Workaround for a docker-modem 2.0.x bug where it sets a default
# socketPath on Windows even if the input options specify a host/port.
if modem.socketPath and modem.host
if opts.socketPath
modem.host = undefined
modem.port = undefined
else if opts.host
modem.socketPath = undefined
return docker
ensureDockerSeemsAccessible = (docker) ->
{ exitWithExpectedError } = require('./patterns')

View File

@ -46,9 +46,9 @@ export async function installQemuIfNeeded(
/**
* Check whether the Docker daemon (including balenaEngine) requires explicit
* QEMU emulation setup. Note that Docker Desktop (Docker for Mac), and
* reportedly also Docker for Windows, have built-in support for binfmt_misc,
* so they do not require explicity QEMU setup. References:
* QEMU emulation setup. Note that Docker Desktop (Windows and Mac), and also
* the older Docker for Mac, have built-in support for binfmt_misc, so they
* do not require explicit QEMU setup. References:
* - https://en.wikipedia.org/wiki/Binfmt_misc
* - https://docs.docker.com/docker-for-mac/multi-arch/
* - https://www.ecliptik.com/Cross-Building-and-Running-Multi-Arch-Docker-Images/
@ -61,7 +61,7 @@ async function platformNeedsQemu(
logger: Logger,
): Promise<boolean> {
const dockerInfo = await docker.info();
// Docker Desktop with Docker Engine 19.03 reports:
// Docker Desktop (Windows and Mac) with Docker Engine 19.03 reports:
// OperatingSystem: Docker Desktop
// OSType: linux
// Docker for Mac with Docker Engine 18.06 reports:

122
npm-shrinkwrap.json generated
View File

@ -548,13 +548,6 @@
"integrity": "sha512-LLiivgWKii4JeMzFy3trrxqkRrVSdue8WmbXyHuSJLwNrhIQU5MTrc65jhxEPwMyh5HR1xevSdD+k2nnSRKw9g==",
"requires": {
"@types/node": "*"
},
"dependencies": {
"@types/node": {
"version": "12.0.10",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.10.tgz",
"integrity": "sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ=="
}
}
},
"@types/events": {
@ -4034,14 +4027,15 @@
"integrity": "sha512-djh3R7KXkEPm80PXK9xbz8bCfEFuU11Tmf5l9IXKdjBPx91/cOqhwOwtOq6s35B8TqrwY6L4xLphmyYmJT0ZXw=="
},
"docker-modem": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-1.0.9.tgz",
"integrity": "sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-2.0.2.tgz",
"integrity": "sha512-Aq6NBJQm5najFlg4wRZtSrWXzQbQClh1kccAkUWIdVhuyHK6tYhmi9W9xtVaGmzBa0Nfuwi4AEbQzWtHZT+2Jw==",
"requires": {
"JSONStream": "1.3.2",
"debug": "^3.2.6",
"readable-stream": "~1.0.26-4",
"split-ca": "^1.0.0"
"split-ca": "^1.0.0",
"ssh2": "^0.8.5"
},
"dependencies": {
"JSONStream": {
@ -4077,6 +4071,24 @@
"string_decoder": "~0.10.x"
}
},
"ssh2": {
"version": "0.8.5",
"resolved": "https://registry.npmjs.org/ssh2/-/ssh2-0.8.5.tgz",
"integrity": "sha512-TkvzxSYYUSQ8jb//HbHnJVui4fVEW7yu/zwBxwro/QaK2EGYtwB+8gdEChwHHuj142c5+250poMC74aJiwApPw==",
"requires": {
"ssh2-streams": "~0.4.4"
}
},
"ssh2-streams": {
"version": "0.4.6",
"resolved": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.4.6.tgz",
"integrity": "sha512-jXq/nk2K82HuueO9CTCdas/a0ncX3fvYzEPKt1+ftKwE5RXTX25GyjcpjBh2lwVUYbk0c9yq6cBczZssWmU3Tw==",
"requires": {
"asn1": "~0.2.0",
"bcrypt-pbkdf": "^1.0.2",
"streamsearch": "~0.1.2"
}
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
@ -4099,9 +4111,9 @@
}
},
"docker-qemu-transpose": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/docker-qemu-transpose/-/docker-qemu-transpose-0.5.3.tgz",
"integrity": "sha512-SAFOPwZSk3kruvEGyCafhjeidggIf42x2u3oSTV/id/hT/jtl8vXw5o6RGpPEQIraUtCyiQ0Vw2NFzGJqvFvVA==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/docker-qemu-transpose/-/docker-qemu-transpose-1.0.1.tgz",
"integrity": "sha512-qTNis+0NUBYhxdigLu6gT9bxMnck0NOd6gc8ci6n3yfSZPiIjtsuWeci3Os0P+GJw8tH08I0pckrtrD/MZ/0Rw==",
"requires": {
"@types/bluebird": "^3.5.2",
"@types/event-stream": "^3.3.31",
@ -4114,18 +4126,14 @@
"jsesc": "^2.5.0",
"lodash": "^4.17.4",
"stream-to-promise": "^2.2.0",
"tar-stream": "^1.5.2"
"tar-stream": "^1.5.2",
"tar-utils": "^2.0.0"
},
"dependencies": {
"@types/lodash": {
"version": "4.14.135",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.135.tgz",
"integrity": "sha512-Ed+tSZ9qM1oYpi5kzdsBuOzcAIn1wDW+e8TFJ50IMJMlSopGdJgKAbhHzN6h1E1OfjlGOr2JepzEWtg9NIfoNg=="
},
"@types/node": {
"version": "7.10.6",
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.6.tgz",
"integrity": "sha512-d0BOAicT0tEdbdVQlLGOVul1kvg6YvbaADRCThGCz5NJ0e9r00SofcR1x69hmlCyrHuB6jd4cKzL9bMLjPnpAA=="
"version": "7.10.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.7.tgz",
"integrity": "sha512-4I7+hXKyq7e1deuzX9udu0hPIYqSSkdKXtjow6fMnQ3OR9qkxIErGHbGY08YrfZJrCS1ajK8lOuzd0k3n2WM4A=="
}
}
},
@ -4229,13 +4237,59 @@
"concat-stream": "~1.6.2",
"docker-modem": "^1.0.8",
"tar-fs": "~1.16.3"
},
"dependencies": {
"JSONStream": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz",
"integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=",
"requires": {
"jsonparse": "^1.2.0",
"through": ">=2.2.7 <3"
}
},
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"requires": {
"ms": "^2.1.1"
}
},
"docker-modem": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-1.0.9.tgz",
"integrity": "sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw==",
"requires": {
"JSONStream": "1.3.2",
"debug": "^3.2.6",
"readable-stream": "~1.0.26-4",
"split-ca": "^1.0.0"
}
},
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
},
"readable-stream": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
"integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
"isarray": "0.0.1",
"string_decoder": "~0.10.x"
}
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
}
}
},
"dockerode-options": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/dockerode-options/-/dockerode-options-0.2.1.tgz",
"integrity": "sha1-E3y4CeznrFta1StffhzXmPOj0LQ="
},
"dom-serializer": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
@ -5473,9 +5527,9 @@
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
},
"fp-ts": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.0.5.tgz",
"integrity": "sha512-opI5r+rVlpZE7Rhk0YtqsrmxGkbIw0dRNqGca8FEAMMnjomXotG+R9QkLQg20onx7R8qhepAn4CCOP8usma/Xw=="
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.1.0.tgz",
"integrity": "sha512-2xTHhLuP0uLjpaHAARpGQ1TpIPqEUMu8fGN5jv8py0T+HgB6a4bV57p5EQoOyeHws4SuYxiUi2/m0isHs6F/cA=="
},
"fragment-cache": {
"version": "0.2.1",
@ -15351,9 +15405,9 @@
}
},
"resin-multibuild": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/resin-multibuild/-/resin-multibuild-4.3.1.tgz",
"integrity": "sha512-tpocIxmIRvMGMMUF5wCjy0DcZS2jIzKZ65CtMoIxMcV9Pp25JjhDyUqIVEpC1RO6I/C+pHqWfhSyLiYj9B+rYg==",
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/resin-multibuild/-/resin-multibuild-4.3.2.tgz",
"integrity": "sha512-ZBMT9AJ6IMkXW6VkQB4ZdNTB8TCpJjiroLleJ/Gmskgjzo/tVbMJPWimpYcpr8JrFfXPn8wt4bGuoVy59CzefA==",
"requires": {
"@types/bluebird": "3.5.20",
"@types/dockerode": "2.5.5",

View File

@ -169,10 +169,10 @@
"common-tags": "^1.7.2",
"denymount": "^2.3.0",
"docker-progress": "^4.0.0",
"docker-qemu-transpose": "^0.5.3",
"docker-qemu-transpose": "^1.0.1",
"docker-modem": "^2.0.2",
"docker-toolbelt": "^3.3.7",
"dockerode": "^2.5.8",
"dockerode-options": "^0.2.1",
"ejs": "^2.5.7",
"etcher-sdk": "^2.0.14",
"event-stream": "3.3.4",
@ -208,7 +208,7 @@
"resin-compose-parse": "^2.1.0",
"resin-doodles": "0.0.1",
"resin-image-fs": "^5.0.8",
"resin-multibuild": "^4.3.1",
"resin-multibuild": "^4.3.2",
"resin-release": "^1.2.0",
"resin-semver": "^1.6.0",
"resin-stream-logger": "^0.1.2",