diff options
author | Damien Martin-Guillerez <dmarting@google.com> | 2015-09-29 15:11:30 +0000 |
---|---|---|
committer | Florian Weikert <fwe@google.com> | 2015-09-30 09:35:22 +0000 |
commit | b00b7ac4c16d5c9e2bab8bf7508bc64e188be861 (patch) | |
tree | 01676d1e46c186c731d39cf5108f0023147ec13b /tools | |
parent | d7b64bd03100300b79cd33d04904ce9b0e6a5332 (diff) |
[docker] Add workdir attribute
The workdir attribute set the initial working directory
when starting the docker container.
Contrary to the WORKDIR directive (see
https://docs.docker.com/reference/builder/#workdir), it only affects
the entry point.
--
MOS_MIGRATED_REVID=104201472
Diffstat (limited to 'tools')
-rw-r--r-- | tools/build_defs/docker/BUILD | 1 | ||||
-rw-r--r-- | tools/build_defs/docker/README.md | 13 | ||||
-rwxr-xr-x | tools/build_defs/docker/build_test.sh | 13 | ||||
-rw-r--r-- | tools/build_defs/docker/docker.bzl | 7 | ||||
-rw-r--r-- | tools/build_defs/docker/rewrite_json.py | 17 | ||||
-rw-r--r-- | tools/build_defs/docker/rewrite_json_test.py | 30 | ||||
-rw-r--r-- | tools/build_defs/docker/testdata/BUILD | 12 |
7 files changed, 86 insertions, 7 deletions
diff --git a/tools/build_defs/docker/BUILD b/tools/build_defs/docker/BUILD index 3d70aa3c43..227ca033a3 100644 --- a/tools/build_defs/docker/BUILD +++ b/tools/build_defs/docker/BUILD @@ -21,6 +21,7 @@ TEST_TARGETS = [ "generated_tarball", "with_env", "with_double_env", + "workdir_with_tar_base", "link_with_files_base", ] diff --git a/tools/build_defs/docker/README.md b/tools/build_defs/docker/README.md index 3d93ec45ce..a225f5c259 100644 --- a/tools/build_defs/docker/README.md +++ b/tools/build_defs/docker/README.md @@ -181,7 +181,7 @@ docker_build( ### `docker_build` `docker_build(name, base, data_path, directory, files, mode, tars, -debs, symlinks, entrypoint, cmd, env, ports, volumes)` +debs, symlinks, entrypoint, cmd, env, ports, volumes, workdir)` <table> <thead> @@ -322,6 +322,17 @@ debs, symlinks, entrypoint, cmd, env, ports, volumes)` of volumes to mount.</a></p> </td> </tr> + <tr> + <td><code>workdir</code></td> + <td> + <code>String, optional</code> + <p><a href="https://docs.docker.com/reference/builder/#workdir">Initial + working directory when running the docker image.</a></p> + <p>Because building the image never happen inside a docker container, + this working directory does not affect the other actions (e.g., + adding files).</p> + </td> + </tr> </tbody> </tbody> </table> diff --git a/tools/build_defs/docker/build_test.sh b/tools/build_defs/docker/build_test.sh index 1f1e22651b..4381552f34 100755 --- a/tools/build_defs/docker/build_test.sh +++ b/tools/build_defs/docker/build_test.sh @@ -110,6 +110,13 @@ function check_env() { check_property Env "notop_${input}" "${@}" } +function check_workdir() { + input="$1" + shift + check_property WorkingDir "${input}" "${@}" + check_property WorkingDir "notop_${input}" "${@}" +} + function check_layers_aux() { local input=${1} shift 1 @@ -212,6 +219,12 @@ function test_files_with_tar_base() { "b0fe5685bf89a2c875a93495a4e2b7a3f1fb6f27a9ac5dc2b174e7d74cb6fe27" } +function test_workdir_with_tar_base() { + check_layers "workdir_with_tar_base" \ + "8b9e4db9dd4b990ee6d8adc2843ad64702ad9063ae6c22e8ca5f94aa54e71277" \ + "f24cbe53bd1b78909c6dba0bd47016354f3488b35b85aeee68ecc423062b927e" +} + function test_tar_with_files_base() { check_layers "tar_with_files_base" \ "240dd12c02aee796394ce18eee3108475f7d544294b17fc90ec54e983601fe1b" \ diff --git a/tools/build_defs/docker/docker.bzl b/tools/build_defs/docker/docker.bzl index 02c8fcf8d9..1f818b032c 100644 --- a/tools/build_defs/docker/docker.bzl +++ b/tools/build_defs/docker/docker.bzl @@ -143,6 +143,8 @@ def _metadata_action(ctx, layer, name, output): "--ports=%s" % ",".join(ctx.attr.ports), "--volumes=%s" % ",".join(ctx.attr.volumes) ] + if ctx.attr.workdir: + args += ["--workdir=" + ctx.attr.workdir] inputs = [layer, rewrite_tool, name] base = _get_base_artifact(ctx) if base: @@ -248,6 +250,7 @@ docker_build_ = rule( "env": attr.string_dict(), "ports": attr.string_list(), # Skylark doesn't support int_list... "volumes": attr.string_list(), + "workdir": attr.string(), # Implicit dependencies. "_build_layer": attr.label( default=Label("//tools/build_defs/docker:build_layer"), @@ -337,10 +340,10 @@ docker_build_ = rule( # # https://docs.docker.com/reference/builder/#volume # volumes=[...], # -# # TODO(mattmoor): NYI # # https://docs.docker.com/reference/builder/#workdir # # NOTE: the normal directive affects subsequent RUN, CMD, -# # ENTRYPOINT, ADD, and COPY +# # ENTRYPOINT, ADD, and COPY, but this attribute only affects +# # the entry point. # workdir="...", # # # https://docs.docker.com/reference/builder/#env diff --git a/tools/build_defs/docker/rewrite_json.py b/tools/build_defs/docker/rewrite_json.py index dd7d205bac..fe62a91149 100644 --- a/tools/build_defs/docker/rewrite_json.py +++ b/tools/build_defs/docker/rewrite_json.py @@ -50,6 +50,10 @@ gflags.DEFINE_list( 'volumes', None, 'Augment the "Volumes" of the previous layer') +gflags.DEFINE_string( + 'workdir', None, + 'Set the working directory for the layer') + gflags.DEFINE_list( 'env', None, 'Augment the "Env" of the previous layer') @@ -58,7 +62,8 @@ FLAGS = gflags.FLAGS _MetadataOptionsT = namedtuple( 'MetadataOptionsT', - ['name', 'parent', 'size', 'entrypoint', 'cmd', 'env', 'ports', 'volumes']) + ['name', 'parent', 'size', 'entrypoint', 'cmd', 'env', 'ports', 'volumes', + 'workdir']) class MetadataOptions(_MetadataOptionsT): @@ -66,12 +71,12 @@ class MetadataOptions(_MetadataOptionsT): def __new__(cls, name=None, parent=None, size=None, entrypoint=None, cmd=None, env=None, - ports=None, volumes=None): + ports=None, volumes=None, workdir=None): """Constructor.""" return super(MetadataOptions, cls).__new__( cls, name=name, parent=parent, size=size, entrypoint=entrypoint, cmd=cmd, env=env, - ports=ports, volumes=volumes) + ports=ports, volumes=volumes, workdir=workdir) _DOCKER_VERSION = '1.5.0' @@ -175,6 +180,9 @@ def RewriteMetadata(data, options): for p in options.volumes: output['config']['Volumes'][p] = {} + if options.workdir: + output['config']['WorkingDir'] = options.workdir + # TODO(mattmoor): comment, created, container_config # container_config contains information about the container @@ -263,7 +271,8 @@ def main(unused_argv): cmd=FLAGS.command, env=FLAGS.env, ports=FLAGS.ports, - volumes=FLAGS.volumes)) + volumes=FLAGS.volumes, + workdir=FLAGS.workdir)) with open(FLAGS.output, 'w') as fp: json.dump(output, fp, sort_keys=True) diff --git a/tools/build_defs/docker/rewrite_json_test.py b/tools/build_defs/docker/rewrite_json_test.py index 80400e7e99..3d89d1dbf5 100644 --- a/tools/build_defs/docker/rewrite_json_test.py +++ b/tools/build_defs/docker/rewrite_json_test.py @@ -646,5 +646,35 @@ class RewriteJsonTest(unittest.TestCase): name=name, parent=parent, volumes=[volume])) self.assertEquals(expected, actual) + def testSetWorkingDir(self): + in_data = { + 'config': { + 'User': 'bleh', + 'WorkingDir': '/home/bleh', + 'Volumes': { + } + } + } + name = 'deadbeef' + parent = 'blah' + workdir = '/some/path' + expected = { + 'id': name, + 'parent': parent, + 'config': { + 'User': 'bleh', + 'WorkingDir': '/some/path', + 'Volumes': { + } + }, + 'docker_version': _DOCKER_VERSION, + 'architecture': _PROCESSOR_ARCHITECTURE, + 'os': _OPERATING_SYSTEM, + } + + actual = RewriteMetadata(in_data, MetadataOptions( + name=name, parent=parent, workdir=workdir)) + self.assertEquals(expected, actual) + if __name__ == '__main__': unittest.main() diff --git a/tools/build_defs/docker/testdata/BUILD b/tools/build_defs/docker/testdata/BUILD index 8b1bcd194a..75d36e4073 100644 --- a/tools/build_defs/docker/testdata/BUILD +++ b/tools/build_defs/docker/testdata/BUILD @@ -68,6 +68,12 @@ docker_build( ) docker_build( + name = "workdir_with_tar_base", + base = ":tar_base", + workdir = "/tmp", +) + +docker_build( name = "files_with_tar_base", base = ":tar_base", files = ["bar"], @@ -216,6 +222,12 @@ docker_build( ) docker_build( + name = "notop_workdir_with_tar_base", + base = ":notop_tar_base", + workdir = "/tmp", +) + +docker_build( name = "notop_tar_with_files_base", base = ":notop_files_base", tars = ["two.tar"], |