1
0
mirror of https://github.com/projectatomic/atomic.git synced 2026-02-05 09:44:59 +01:00

Add --storage to install|run

To have parity function with pull, we need to add --storage
to install and run.  This allows for overriding when atomic.type
is defined.  For example, if you pull an image that has
atomic.type=system but you really want to store it
on the docker backend.

Closes: #861
Approved by: baude
This commit is contained in:
Brent Baude
2017-02-02 10:51:46 -06:00
committed by Atomic Bot
parent 3d2acc23e8
commit 02bd134f1c
7 changed files with 81 additions and 10 deletions

View File

@@ -246,7 +246,6 @@ class DockerBackend(Backend):
with open(path, 'rb') as f:
self.d.load_image(data=f)
return 0
# remote_image_obj = self.make_remote_image(image)
fq_name = remote_image_obj.fq_name
local_image = self.has_image(image)
if local_image is not None:

View File

@@ -158,4 +158,5 @@ class BackendUtils(object):
@staticmethod
def message_backend_change(previous, new):
write_out("\nNote: Switching from the '{}' backend to the '{}' backend based on the 'atomic.type' label in the "
"image. You can use --storage to override this behaviour.\n".format(previous, new))
"image. You can use --storage to override this behaviour.\n".format(previous, new))

View File

@@ -29,6 +29,9 @@ INSTALL_ARGS = ["run",
"--name", "${NAME}",
"${IMAGE}"]
ATOMIC_CONFIG = util.get_atomic_config()
_storage = ATOMIC_CONFIG.get('default_storage', "docker")
def cli(subparser):
# atomic install
installp = subparser.add_parser(
@@ -40,6 +43,10 @@ def cli(subparser):
"%s'" % Install.print_install())
installp.set_defaults(_class=Install, func='install')
add_opt(installp)
installp.add_argument("--storage", dest="storage", default=None,
help=_("Specify the storage. Default is currently '%s'. You can"
" change the default by editing /etc/atomic.conf and changing"
" the 'default_storage' field." % _storage))
installp.add_argument("-n", "--name", dest="name", default=None,
help=_("name of container"))
installp.add_argument(
@@ -80,6 +87,12 @@ class Install(Atomic):
def install(self):
if self.args.debug:
util.write_out(str(self.args))
storage_set = False if self.args.storage is None else True
storage = _storage if not storage_set else self.args.storage
args_system = getattr(self.args, 'system', None)
args_user= getattr(self.args, 'user', None)
if (args_system or args_user) and storage != 'ostree' and storage_set:
raise ValueError("The --system and --user options are only available for the 'ostree' storage.")
be_utils = BackendUtils()
try:
# Check to see if the container already exists
@@ -92,7 +105,7 @@ class Install(Atomic):
if not util.is_user_mode():
raise ValueError("--user does not work for privileged user")
return self.syscontainers.install_user_container(self.image, self.name)
elif self.system:
elif self.system or storage == 'ostree':
return self.syscontainers.install(self.image, self.name)
elif OSTREE_PRESENT and self.args.setvalues:
raise ValueError("--set is valid only when used with --system or --user")
@@ -106,7 +119,7 @@ class Install(Atomic):
remote_image_obj = be.make_remote_image(self.args.image)
# We found an atomic.type of system, therefore install it onto the ostree
# backend
if remote_image_obj.is_system_type:
if remote_image_obj.is_system_type and not storage_set:
be_utils.message_backend_change('docker', 'ostree')
return self.syscontainers.install(self.image, self.name)
be.pull_image(self.args.image, remote_image_obj, debug=self.args.debug)

View File

@@ -30,6 +30,10 @@ RUN_ARGS = ["-i",
"--name", "${NAME}",
"${IMAGE}"]
ATOMIC_CONFIG = util.get_atomic_config()
_storage = ATOMIC_CONFIG.get('default_storage', "docker")
def cli(subparser):
# atomic run
runp = subparser.add_parser(
@@ -41,6 +45,10 @@ def cli(subparser):
runp.set_defaults(_class=Run, func='run')
run_group = runp.add_mutually_exclusive_group()
util.add_opt(runp)
runp.add_argument("--storage", dest="storage", default=None,
help=_("Specify the storage. Default is currently '%s'. You can"
" change the default by editing /etc/atomic.conf and changing"
" the 'default_storage' field." % _storage))
runp.add_argument("-n", "--name", dest="name", default=None,
help=_("name of container"))
runp.add_argument("--spc", default=False, action="store_true",
@@ -70,23 +78,26 @@ class Run(Atomic):
self.SPC_ARGS = SPC_ARGS
def run(self):
storage_set = False if self.args.storage is None else True
storage = _storage if not storage_set else self.args.storage
be_utils = BackendUtils()
if self.name:
be_utils = BackendUtils()
try:
be, con_obj = be_utils.get_backend_and_container_obj(self.name)
return be.run(con_obj, atomic=self, args=self.args)
except ValueError:
pass
be = be_utils.get_backend_from_string(storage)
db = DockerBackend()
img_object = db.has_image(self.image)
if img_object is None:
img_object = be.has_image(self.image)
if img_object is None and storage == 'docker':
self.display("Need to pull %s" % self.image)
remote_image_obj = db.make_remote_image(self.args.image)
# If the image has a atomic.type of system, then we need to land
# this in the ostree backend. Install it and then start it
# because this is run
if remote_image_obj.is_system_type:
if remote_image_obj.is_system_type and not storage_set:
be = be_utils.get_backend_from_string('ostree')
be_utils.message_backend_change('docker', 'ostree')
be.install(self.image, self.name)
@@ -99,8 +110,15 @@ class Run(Atomic):
img_object = db.has_image(self.image)
except RegistryInspectError:
raise ValueError("Unable to find image {}".format(self.image))
db.run(img_object, atomic=self, args=self.args)
if storage == 'ostree':
if img_object is None:
be.pull_image(self.args.image, None)
# For system containers, the run method really needs a container obj
con_obj = be.has_container(self.name)
if con_obj is None:
be.install(self.image, self.name)
img_object = be.has_container(self.name)
be.run(img_object, atomic=self, args=self.args)
@staticmethod
def print_run():

View File

@@ -489,6 +489,13 @@ _atomic_containers_delete() {
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
@@ -654,12 +661,20 @@ _atomic_run() {
--spc
--display
--quiet
--storage
"
[ "$command" = "run" ] && all_options="$all_options"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
esac
case "$prev" in
$options_with_args_glob )
return
@@ -688,6 +703,7 @@ _atomic_install() {
--help
--display
--rootfs
--storage
--system
--set
--user
@@ -695,6 +711,13 @@ _atomic_install() {
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
esac
case "$prev" in
$options_with_args_glob )
return

View File

@@ -11,6 +11,7 @@ atomic-install - Execute Image Install Method
[**-n**][**--name**[=*NAME*]]
[**--rootfs**=*ROOTFS*]
[**--set**=*NAME*=*VALUE*]
[**--storage**]
[**--system**]
IMAGE [ARG...]
@@ -73,6 +74,12 @@ Set a value that is going to be used by a system container for its
configuration and can be specified multiple times. It is used only
by --system. OSTree is required for this feature to be available.
**--storage**
Allows you to override the default definition for the storage backend
where your image will reside if pulled. If the image is already local,
the --storage option will dictate where atomic should look for the image
prior to installing. Valid options are `docker` and `ostree`.
**--system**
Install a system container. A system container is a container that
is executed out of an systemd unit file early in boot, using runc.
@@ -85,6 +92,10 @@ default under /var/lib/containers/atomic/ and generating the
configuration files for runc and systemd.
OSTree and runc are required for this feature to be available.
Note: If the image being pulled contains a label of `system.type=ostree`,
atomic will automatically substitute the storage backend to be ostree. This
can be overridden with the --storage option.
**--user**
If running as non-root, specify to install the image from the current
OSTree repository and manage it through systemd and bubblewrap.

View File

@@ -10,6 +10,7 @@ atomic-run - Execute container image run method
[**--display**]
[**-n**][**--name**[=*NAME*]]
[**--spc**]
[**--storage**]
[**--quiet**]
IMAGE [COMMAND] [ARG...]
@@ -70,6 +71,11 @@ NAME will default to the IMAGENAME if it is not specified.
`/usr/bin/docker run -t -i --rm --privileged -v /:/host -v /run:/run --net=host --ipc=host --pid=host -e HOST=/host -e NAME=${NAME} -e IMAGE=${IMAGE} --name ${NAME} ${IMAGE}`
**-storage**
Allows you to override the default definition for the storage backend where your image will reside if pulled. If the image is already local,
the --storage option will dictate where atomic should look for the image prior to running. Valid options are `docker` and `ostree`.
**--quiet**
Run without verbose messaging (i.e. security warnings).