aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xtools/build_defs/docker/build_test.sh13
-rw-r--r--tools/build_defs/docker/docker.bzl4
-rw-r--r--tools/build_defs/docker/rewrite_json.py11
3 files changed, 26 insertions, 2 deletions
diff --git a/tools/build_defs/docker/build_test.sh b/tools/build_defs/docker/build_test.sh
index 046705bd7b..785b39925c 100755
--- a/tools/build_defs/docker/build_test.sh
+++ b/tools/build_defs/docker/build_test.sh
@@ -124,6 +124,13 @@ function check_workdir() {
check_property WorkingDir "notop_${input}" "${@}"
}
+function check_user() {
+ input="$1"
+ shift
+ check_property User "${input}" "${@}"
+ check_property User "notop_${input}" "${@}"
+}
+
function check_layers_aux() {
local input=${1}
shift 1
@@ -369,6 +376,12 @@ function test_with_double_label() {
'["com.example.bar={\"name\": \"blah\"}", "com.example.baz=qux", "com.example.foo={\"name\": \"blah\"}", "com.example.qux={\"name\": \"blah-blah\"}"]'
}
+function test_with_user() {
+ check_user "with_user" \
+ "65664d4d78ff321684e2a8bf165792ce562c5990c9ba992e6288dcb1ec7f675c" \
+ "\"nobody\""
+}
+
function get_layer_listing() {
local input=$1
local layer=$2
diff --git a/tools/build_defs/docker/docker.bzl b/tools/build_defs/docker/docker.bzl
index 4d971f5b3c..5fcedd5007 100644
--- a/tools/build_defs/docker/docker.bzl
+++ b/tools/build_defs/docker/docker.bzl
@@ -175,6 +175,8 @@ def _metadata_action(ctx, layer, name, output):
if base:
args += ["--base=%s" % base.path]
inputs += [base]
+ if ctx.attr.user:
+ args += ["--user=" + ctx.attr.user]
ctx.action(
executable = rewrite_tool,
@@ -322,6 +324,7 @@ docker_build_ = rule(
"symlinks": attr.string_dict(),
"entrypoint": attr.string_list(),
"cmd": attr.string_list(),
+ "user": attr.string(),
"env": attr.string_dict(),
"labels": attr.string_dict(),
"ports": attr.string_list(), # Skylark doesn't support int_list...
@@ -421,7 +424,6 @@ docker_build_ = rule(
# # https://docs.docker.com/reference/builder/#maintainer
# maintainer="...",
#
-# # TODO(mattmoor): NYI
# # https://docs.docker.com/reference/builder/#user
# # NOTE: the normal directive affects subsequent RUN, CMD,
# # and ENTRYPOINT
diff --git a/tools/build_defs/docker/rewrite_json.py b/tools/build_defs/docker/rewrite_json.py
index 11933e5d51..933a640d2e 100644
--- a/tools/build_defs/docker/rewrite_json.py
+++ b/tools/build_defs/docker/rewrite_json.py
@@ -42,6 +42,9 @@ gflags.DEFINE_list(
'command', None,
'Override the "Cmd" of the previous layer')
+gflags.DEFINE_string(
+ 'user', None, 'The username to run commands under')
+
gflags.DEFINE_list('labels', None, 'Augment the "Label" of the previous layer')
gflags.DEFINE_list(
@@ -64,7 +67,8 @@ FLAGS = gflags.FLAGS
_MetadataOptionsT = namedtuple('MetadataOptionsT',
['name', 'parent', 'size', 'entrypoint', 'cmd',
- 'env', 'labels', 'ports', 'volumes', 'workdir'])
+ 'env', 'labels', 'ports', 'volumes', 'workdir',
+ 'user'])
class MetadataOptions(_MetadataOptionsT):
@@ -76,6 +80,7 @@ class MetadataOptions(_MetadataOptionsT):
size=None,
entrypoint=None,
cmd=None,
+ user=None,
labels=None,
env=None,
ports=None,
@@ -88,6 +93,7 @@ class MetadataOptions(_MetadataOptionsT):
size=size,
entrypoint=entrypoint,
cmd=cmd,
+ user=user,
labels=labels,
env=env,
ports=ports,
@@ -167,6 +173,8 @@ def RewriteMetadata(data, options):
output['config']['Entrypoint'] = options.entrypoint
if options.cmd:
output['config']['Cmd'] = options.cmd
+ if options.user:
+ output['config']['User'] = options.user
output['docker_version'] = _DOCKER_VERSION
output['architecture'] = _PROCESSOR_ARCHITECTURE
@@ -303,6 +311,7 @@ def main(unused_argv):
size=os.path.getsize(FLAGS.layer),
entrypoint=FLAGS.entrypoint,
cmd=FLAGS.command,
+ user=FLAGS.user,
labels=labels,
env=KeyValueToDict(FLAGS.env),
ports=FLAGS.ports,