providers/docker: support auth [GH-4042]
This commit is contained in:
parent
cff57c8d01
commit
296d0639cc
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
IMPROVEMENTS:
|
IMPROVEMENTS:
|
||||||
|
|
||||||
|
- providers/docker: Can now start containers from private repositories
|
||||||
|
more easily. Vagrant will login for you if you specify auth. [GH-4042]
|
||||||
- providers/docker: `stop_timeout` can be used to modify the `docker stop`
|
- providers/docker: `stop_timeout` can be used to modify the `docker stop`
|
||||||
timeout. [GH-4504]
|
timeout. [GH-4504]
|
||||||
|
|
||||||
|
|
|
@ -241,6 +241,7 @@ module VagrantPlugins
|
||||||
b2.use PrepareNFSValidIds
|
b2.use PrepareNFSValidIds
|
||||||
b2.use SyncedFolderCleanup
|
b2.use SyncedFolderCleanup
|
||||||
b2.use PrepareNFSSettings
|
b2.use PrepareNFSSettings
|
||||||
|
b2.use Login
|
||||||
b2.use Build
|
b2.use Build
|
||||||
|
|
||||||
if env[:machine_action] != :run_command
|
if env[:machine_action] != :run_command
|
||||||
|
@ -295,6 +296,7 @@ module VagrantPlugins
|
||||||
autoload :HostMachineSyncFoldersDisable, action_root.join("host_machine_sync_folders_disable")
|
autoload :HostMachineSyncFoldersDisable, action_root.join("host_machine_sync_folders_disable")
|
||||||
autoload :IsBuild, action_root.join("is_build")
|
autoload :IsBuild, action_root.join("is_build")
|
||||||
autoload :IsHostMachineCreated, action_root.join("is_host_machine_created")
|
autoload :IsHostMachineCreated, action_root.join("is_host_machine_created")
|
||||||
|
autoload :Login, action_root.join("login")
|
||||||
autoload :PrepareSSH, action_root.join("prepare_ssh")
|
autoload :PrepareSSH, action_root.join("prepare_ssh")
|
||||||
autoload :Stop, action_root.join("stop")
|
autoload :Stop, action_root.join("stop")
|
||||||
autoload :PrepareNFSValidIds, action_root.join("prepare_nfs_valid_ids")
|
autoload :PrepareNFSValidIds, action_root.join("prepare_nfs_valid_ids")
|
||||||
|
|
|
@ -48,9 +48,6 @@ module VagrantPlugins
|
||||||
# hold the lock, we'll see the updated state.
|
# hold the lock, we'll see the updated state.
|
||||||
host_machine.reload
|
host_machine.reload
|
||||||
|
|
||||||
p host_machine.id
|
|
||||||
p host_machine.ssh_info
|
|
||||||
|
|
||||||
# See if the machine is ready already. If not, start it.
|
# See if the machine is ready already. If not, start it.
|
||||||
if host_machine.communicate.ready?
|
if host_machine.communicate.ready?
|
||||||
env[:machine].ui.detail(I18n.t("docker_provider.host_machine_ready"))
|
env[:machine].ui.detail(I18n.t("docker_provider.host_machine_ready"))
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
require "log4r"
|
||||||
|
|
||||||
|
module VagrantPlugins
|
||||||
|
module DockerProvider
|
||||||
|
module Action
|
||||||
|
class Login
|
||||||
|
def initialize(app, env)
|
||||||
|
@app = app
|
||||||
|
@logger = Log4r::Logger.new("vagrant::docker::login")
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
config = env[:machine].provider_config
|
||||||
|
driver = env[:machine].provider.driver
|
||||||
|
|
||||||
|
# If we don't have a password set, don't auth
|
||||||
|
return @app.call(env) if config.password == ""
|
||||||
|
|
||||||
|
# Grab a host VM lock to do the login so that we only login
|
||||||
|
# once per container for the rest of this process.
|
||||||
|
env[:machine].provider.host_vm_lock do
|
||||||
|
# Login!
|
||||||
|
env[:ui].output(I18n.t("docker_provider.logging_in"))
|
||||||
|
driver.login(
|
||||||
|
config.email, config.username,
|
||||||
|
config.password, config.auth_server)
|
||||||
|
|
||||||
|
# Continue, within the lock, so that the auth is protected
|
||||||
|
# from meddling.
|
||||||
|
@app.call(env)
|
||||||
|
|
||||||
|
# Log out
|
||||||
|
driver.logout(config.auth_server)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -89,6 +89,37 @@ module VagrantPlugins
|
||||||
# @return [String]
|
# @return [String]
|
||||||
attr_accessor :vagrant_vagrantfile
|
attr_accessor :vagrant_vagrantfile
|
||||||
|
|
||||||
|
#--------------------------------------------------------------
|
||||||
|
# Auth Settings
|
||||||
|
#--------------------------------------------------------------
|
||||||
|
|
||||||
|
# Server to authenticate to. If blank, will use the default
|
||||||
|
# Docker authentication endpoint (which is the Docker Hub at the
|
||||||
|
# time of this comment).
|
||||||
|
#
|
||||||
|
# @return [String]
|
||||||
|
attr_accessor :auth_server
|
||||||
|
|
||||||
|
# Email for logging in to a remote Docker server.
|
||||||
|
#
|
||||||
|
# @return [String]
|
||||||
|
attr_accessor :email
|
||||||
|
|
||||||
|
# Email for logging in to a remote Docker server.
|
||||||
|
#
|
||||||
|
# @return [String]
|
||||||
|
attr_accessor :username
|
||||||
|
|
||||||
|
# Password for logging in to a remote Docker server. If this is
|
||||||
|
# not blank, then Vagrant will run `docker login` prior to any
|
||||||
|
# Docker runs.
|
||||||
|
#
|
||||||
|
# The presence of auth will also force the Docker environments to
|
||||||
|
# serialize on `up` so that different users/passwords don't overlap.
|
||||||
|
#
|
||||||
|
# @return [String]
|
||||||
|
attr_accessor :password
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@build_args = []
|
@build_args = []
|
||||||
@build_dir = UNSET_VALUE
|
@build_dir = UNSET_VALUE
|
||||||
|
@ -109,6 +140,11 @@ module VagrantPlugins
|
||||||
@volumes = []
|
@volumes = []
|
||||||
@vagrant_machine = UNSET_VALUE
|
@vagrant_machine = UNSET_VALUE
|
||||||
@vagrant_vagrantfile = UNSET_VALUE
|
@vagrant_vagrantfile = UNSET_VALUE
|
||||||
|
|
||||||
|
@auth_server = UNSET_VALUE
|
||||||
|
@email = UNSET_VALUE
|
||||||
|
@username = UNSET_VALUE
|
||||||
|
@password = UNSET_VALUE
|
||||||
end
|
end
|
||||||
|
|
||||||
def link(name)
|
def link(name)
|
||||||
|
@ -162,6 +198,11 @@ module VagrantPlugins
|
||||||
@vagrant_machine = nil if @vagrant_machine == UNSET_VALUE
|
@vagrant_machine = nil if @vagrant_machine == UNSET_VALUE
|
||||||
@vagrant_vagrantfile = nil if @vagrant_vagrantfile == UNSET_VALUE
|
@vagrant_vagrantfile = nil if @vagrant_vagrantfile == UNSET_VALUE
|
||||||
|
|
||||||
|
@auth_server = nil if @auth_server == UNSET_VALUE
|
||||||
|
@email = "" if @email == UNSET_VALUE
|
||||||
|
@username = "" if @username == UNSET_VALUE
|
||||||
|
@password = "" if @password == UNSET_VALUE
|
||||||
|
|
||||||
if @host_vm_build_dir_options == UNSET_VALUE
|
if @host_vm_build_dir_options == UNSET_VALUE
|
||||||
@host_vm_build_dir_options = nil
|
@host_vm_build_dir_options = nil
|
||||||
end
|
end
|
||||||
|
|
|
@ -86,6 +86,22 @@ module VagrantPlugins
|
||||||
inspect_container(cid)['HostConfig']['Privileged']
|
inspect_container(cid)['HostConfig']['Privileged']
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def login(email, username, password, server)
|
||||||
|
cmd = %W(docker login)
|
||||||
|
cmd += ["-e", email] if email != ""
|
||||||
|
cmd += ["-u", username] if username != ""
|
||||||
|
cmd += ["-p", password] if password != ""
|
||||||
|
cmd << server if server && server != ""
|
||||||
|
|
||||||
|
execute(*cmd.flatten)
|
||||||
|
end
|
||||||
|
|
||||||
|
def logout(server)
|
||||||
|
cmd = %W(docker logout)
|
||||||
|
cmd << server if server && server != ""
|
||||||
|
execute(*cmd.flatten)
|
||||||
|
end
|
||||||
|
|
||||||
def start(cid)
|
def start(cid)
|
||||||
if !running?(cid)
|
if !running?(cid)
|
||||||
execute('docker', 'start', cid)
|
execute('docker', 'start', cid)
|
||||||
|
|
|
@ -33,6 +33,8 @@ en:
|
||||||
host. You'll see the output of the `vagrant up` for this VM below.
|
host. You'll see the output of the `vagrant up` for this VM below.
|
||||||
host_machine_syncing_folders: |-
|
host_machine_syncing_folders: |-
|
||||||
Syncing folders to the host VM...
|
Syncing folders to the host VM...
|
||||||
|
logging_in: |-
|
||||||
|
Logging in to Docker server...
|
||||||
logs_host_state_unknown: |-
|
logs_host_state_unknown: |-
|
||||||
This container requires a host VM, and the state of that VM
|
This container requires a host VM, and the state of that VM
|
||||||
is unknown. Run `vagrant up` to verify that the container and
|
is unknown. Run `vagrant up` to verify that the container and
|
||||||
|
|
|
@ -50,6 +50,11 @@ describe VagrantPlugins::DockerProvider::Config do
|
||||||
its(:stop_timeout) { should eq(1) }
|
its(:stop_timeout) { should eq(1) }
|
||||||
its(:vagrant_machine) { should be_nil }
|
its(:vagrant_machine) { should be_nil }
|
||||||
its(:vagrant_vagrantfile) { should be_nil }
|
its(:vagrant_vagrantfile) { should be_nil }
|
||||||
|
|
||||||
|
its(:auth_server) { should be_nil }
|
||||||
|
its(:email) { should eq("") }
|
||||||
|
its(:username) { should eq("") }
|
||||||
|
its(:password) { should eq("") }
|
||||||
end
|
end
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|
|
@ -18,6 +18,8 @@ you may set. A complete reference is shown below.
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
|
General settings:
|
||||||
|
|
||||||
* `build_args` (array of strings) - Extra arguments to pass to
|
* `build_args` (array of strings) - Extra arguments to pass to
|
||||||
`docker build` when `build_dir` is in use.
|
`docker build` when `build_dir` is in use.
|
||||||
|
|
||||||
|
@ -76,3 +78,16 @@ you may set. A complete reference is shown below.
|
||||||
volumes into the container. These directories must exist in the
|
volumes into the container. These directories must exist in the
|
||||||
host where Docker is running. If you want to sync folders from the
|
host where Docker is running. If you want to sync folders from the
|
||||||
host Vagrant is running, just use synced folders.
|
host Vagrant is running, just use synced folders.
|
||||||
|
|
||||||
|
Below, we have settings related to auth. If these are set, then Vagrant
|
||||||
|
will `docker login` prior to starting containers, allowing you to pull
|
||||||
|
images from private repositories.
|
||||||
|
|
||||||
|
* `email` (string) - Email address for logging in.
|
||||||
|
|
||||||
|
* `username` (string) - Username for logging in.
|
||||||
|
|
||||||
|
* `password` (string) - Password for logging in.
|
||||||
|
|
||||||
|
* `auth_server` (string) - The server to use for authentication. If not
|
||||||
|
set, the Docker Hub will be used.
|
||||||
|
|
Loading…
Reference in New Issue