aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
authorGravatar Damien Martin-Guillerez <dmarting@google.com>2015-09-29 15:11:30 +0000
committerGravatar Florian Weikert <fwe@google.com>2015-09-30 09:35:22 +0000
commitb00b7ac4c16d5c9e2bab8bf7508bc64e188be861 (patch)
tree01676d1e46c186c731d39cf5108f0023147ec13b /tools
parentd7b64bd03100300b79cd33d04904ce9b0e6a5332 (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/BUILD1
-rw-r--r--tools/build_defs/docker/README.md13
-rwxr-xr-xtools/build_defs/docker/build_test.sh13
-rw-r--r--tools/build_defs/docker/docker.bzl7
-rw-r--r--tools/build_defs/docker/rewrite_json.py17
-rw-r--r--tools/build_defs/docker/rewrite_json_test.py30
-rw-r--r--tools/build_defs/docker/testdata/BUILD12
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"],