1 | const cli = require('heroku-cli-util')
|
2 | const log = require('../lib/log')
|
3 | const Sanbashi = require('../lib/sanbashi')
|
4 |
|
5 | module.exports = function (topic) {
|
6 | return {
|
7 | topic: topic,
|
8 | command: 'login',
|
9 | flags: [{name: 'verbose', char: 'v', hasValue: false}],
|
10 | description: 'log in to Heroku Container Registry',
|
11 | help: `Usage:
|
12 | heroku container:login`,
|
13 | needsApp: false,
|
14 | needsAuth: true,
|
15 | run: cli.command(login)
|
16 | }
|
17 | }
|
18 |
|
19 | async function login (context, heroku) {
|
20 | let herokuHost = process.env.HEROKU_HOST || 'heroku.com'
|
21 | let registry = `registry.${herokuHost}`
|
22 | let password = context.auth.password
|
23 |
|
24 | try {
|
25 | await dockerLogin(registry, password, context.flags.verbose)
|
26 | } catch (err) {
|
27 | cli.error(`Error: docker login exited with ${err}`, 1)
|
28 | }
|
29 | }
|
30 |
|
31 | async function dockerLogin (registry, password, verbose) {
|
32 | let [major, minor] = await Sanbashi.version()
|
33 |
|
34 | if (major > 17 || major === 17 && minor >= 7) {
|
35 | return await dockerLoginStdin(registry, password, verbose)
|
36 | }
|
37 | return await dockerLoginArgv(registry, password, verbose)
|
38 | }
|
39 |
|
40 | function dockerLoginStdin (registry, password, verbose) {
|
41 | let args = [
|
42 | 'login',
|
43 | '--username=_',
|
44 | '--password-stdin',
|
45 | registry
|
46 | ]
|
47 |
|
48 | log(verbose, args)
|
49 | return Sanbashi.cmd('docker', args, {input: password})
|
50 | }
|
51 |
|
52 | function dockerLoginArgv (registry, password, verbose) {
|
53 | let args = [
|
54 | 'login',
|
55 | '--username=_',
|
56 | `--password=${password}`,
|
57 | registry
|
58 | ]
|
59 | log(verbose, args)
|
60 | return Sanbashi.cmd('docker', args)
|
61 | }
|