Skip to content

Commit b607197

Browse files
committed
cs61-build-docker uses user ID from environment
1 parent 63faaa0 commit b607197

File tree

4 files changed

+86
-26
lines changed

4 files changed

+86
-26
lines changed

cs61-run-docker

+39-18
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ verbose=false
88
arch="`arch`"
99
tag=
1010
platform=
11+
container=
1112
while test "$#" -ne 0; do
1213
if test "$1" = "-f" -o "$1" = "--fresh"; then
1314
fresh=1
@@ -26,12 +27,18 @@ while test "$#" -ne 0; do
2627
elif test "$1" = "-x" -o "$1" = "--x86-64" -o "$1" = "--x86_64" -o "$1" = "--amd64"; then
2728
platform=linux/amd64
2829
shift
30+
elif test "(" "$1" = "-t" -o "$1" = "--tag" ")" -a "$#" -gt 1; then
31+
tag="$2"
32+
shift 2
33+
elif test -z "$container" -a -z "$fresh" -a -n "$1" && expr "$1" : '[0-9a-f][0-9a-f][0-9a-f]*$' >/dev/null 2>&1; then
34+
container="$1"
35+
shift
2936
else
3037
armtext=
3138
if test "$arch" = "arm64" -o "$arch" = "aarch64"; then
3239
armtext=" [-a|--arm] [-x|--x86-64]"
3340
fi
34-
echo "Usage: cs61-run-docker [-f|--fresh]$armtext [-V|--verbose]" 1>&2
41+
echo "Usage: cs61-run-docker [-f|--fresh]$armtext [-V|--verbose] [CONTAINERID]" 1>&2
3542
exit 1
3643
fi
3744
done
@@ -61,6 +68,13 @@ else
6168
fi
6269
myfileid=`stat $statformatarg %d:%i "${BASH_SOURCE[0]}" 2>/dev/null`
6370

71+
ssharg=
72+
sshenvarg=
73+
if test -n "$SSH_AUTH_SOCK" -a "`uname`" = Darwin; then
74+
ssharg=" --mount type=bind,src=/run/host-services/ssh-auth.sock,target=/run/host-services/ssh-auth.sock"
75+
sshenvarg=" -e SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock"
76+
fi
77+
6478
dir="`pwd`"
6579
subdir=""
6680
while test "$dir" != / -a "$dir" != ""; do
@@ -78,24 +92,31 @@ if test -z "$maindir" && expr "${BASH_SOURCE[0]}" : / >/dev/null 2>&1; then
7892
subdir=""
7993
fi
8094

81-
ssharg=
82-
sshenvarg=
83-
if test -n "$SSH_AUTH_SOCK" -a "`uname`" = Darwin; then
84-
ssharg=" --mount type=bind,src=/run/host-services/ssh-auth.sock,target=/run/host-services/ssh-auth.sock"
85-
sshenvarg=" -e SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock"
86-
fi
87-
88-
if test -n "$maindir" -a -z "$fresh"; then
89-
existing_image="`docker ps -f status=running -f ancestor=$tag -f volume=/host_mnt"$maindir" --no-trunc --format "{{.CreatedAt}},{{.ID}}" | sort -r | head -n 1`"
90-
if test -n "$existing_image"; then
91-
created_at="`echo $existing_image | sed 's/,.*//'`"
92-
image="`echo $existing_image | sed 's/^.*,//'`"
93-
image12="`echo $image | head -c 12`"
94-
echo "* Using running container $image12, created $created_at" 1>&2
95-
echo "- To start a new container, exit then \`cs61-run-docker -f\`" 1>&2
96-
echo "- To kill this container, exit then \`docker kill $image12\`" 1>&2
97-
vexec docker exec -it$sshenvarg $image /bin/bash
95+
existing_image=""
96+
if test -n "$container"; then
97+
existing_image="`docker ps -f "id=$container" --no-trunc --format "{{.CreatedAt}},{{.ID}}" | sort -r | head -n 1`"
98+
if test -z "$existing_image"; then
99+
echo "* Container $container not found" 1>&2
100+
echo "- To start a new container, try \`cs61-run-docker -f\`" 1>&2
101+
echo "- To list executing containers, try \`docker ps\`" 1>&2
102+
exit 1
103+
elif test "`echo "$existing_image" | wc -l`" -gt 1; then
104+
echo "* Container $container ambiguous" 1>&2
105+
echo "- To start a new container, try \`cs61-run-docker -f\`" 1>&2
106+
echo "- To list executing containers, try \`docker ps\`" 1>&2
107+
exit 1
98108
fi
109+
elif test -n "$maindir" -a -z "$fresh"; then
110+
existing_image="`docker ps -f status=running -f ancestor=$tag -f volume=/host_mnt"$maindir" --no-trunc --format "{{.CreatedAt}},{{.ID}}" | sort -r | head -n 1`"
111+
fi
112+
if test -n "$existing_image"; then
113+
created_at="`echo $existing_image | sed 's/,.*//'`"
114+
image="`echo $existing_image | sed 's/^.*,//'`"
115+
image12="`echo $image | head -c 12`"
116+
echo "* Using running container $image12, created $created_at" 1>&2
117+
echo "- To start a new container, exit then \`cs61-run-docker -f\`" 1>&2
118+
echo "- To kill this container, exit then \`docker kill $image12\`" 1>&2
119+
vexec docker exec -it$sshenvarg $image /bin/bash
99120
fi
100121

101122
netarg=

docker/Dockerfile

+2-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ ENV LANG=en_US.UTF-8
8585
RUN rm -r /var/lib/apt/lists/*
8686

8787
# set up passwordless sudo for user cs61-user
88-
RUN useradd -m -s /bin/bash cs61-user &&\
88+
ARG UID=1001
89+
RUN useradd -m -s /bin/bash -u "${UID}" cs61-user &&\
8990
echo "cs61-user ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/cs61-init
9091

9192
# create binary reporting version of dockerfile

docker/Dockerfile.arm64

+2-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ ENV LANG=en_US.UTF-8
117117
RUN rm -r /var/lib/apt/lists/*
118118

119119
# set up passwordless sudo for user cs61-user
120-
RUN useradd -m -s /bin/bash cs61-user &&\
120+
ARG UID=1001
121+
RUN useradd -m -s /bin/bash -u "${UID}" cs61-user &&\
121122
echo "cs61-user ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/cs61-init
122123

123124
# create binary reporting version of dockerfile

docker/cs61-build-docker

+43-6
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,24 @@ cd `dirname $0`
44

55
arch="`arch`"
66
tag=
7+
uid=
78
platform=
89
args=()
10+
11+
# Except on Darwin, adopt current UID by default.
12+
if test "`uname`" != Darwin; then
13+
uid="`id -u`"
14+
fi
15+
16+
usage () {
17+
armtext=
18+
if test "$arch" = "arm64" -o "$arch" = "aarch64"; then
19+
armtext=" [-a|--arm] [-x|--x86-64] [-u UID]"
20+
fi
21+
echo "Usage: cs61-build-docker$armtext" 1>&2
22+
exit 1
23+
}
24+
925
while test "$#" -ne 0; do
1026
if test "$1" = "-a" -o "$1" = "--arm" -o "$1" = "--arm64"; then
1127
if test "`arch`" = "arm64" -o "`arch`" = "aarch64"; then
@@ -21,26 +37,47 @@ while test "$#" -ne 0; do
2137
elif expr "$1" : "--progress=.*" "|" "$1" = "--no-cache" > /dev/null; then
2238
args+=( "$1" )
2339
shift
24-
else
25-
armtext=
26-
if test "$arch" = "arm64" -o "$arch" = "aarch64"; then
27-
armtext=" [-a|--arm] [-x|--x86-64]"
40+
elif test "$1" = "-u" -o "$1" = "--user"; then
41+
if expr "$2" : "[0-9][0-9]*$" >/dev/null; then
42+
uid="$2"
43+
shift 2
44+
else
45+
usage
46+
fi
47+
elif expr "$1" : "-u[0-9]*$" "|" "$1" : "--user=[0-9][0-9]*" >/dev/null; then
48+
uid="`echo "$1" | sed 's/^[^0-9]*//'`"
49+
shift
50+
elif test "$1" = "-t" -o "$1" = "--tag"; then
51+
if expr "$2" : "..*$" >/dev/null; then
52+
tag="$2"
53+
shift 2
54+
else
55+
usage
2856
fi
29-
echo "Usage: cs61-build-docker$armtext" 1>&2
30-
exit 1
57+
elif expr "$1" : "-t..*$" "|" "$1" : "--tag=..*" >/dev/null; then
58+
tag="`echo "$1" | sed 's/^--tag=//;s/^-t//'`"
59+
shift
60+
else
61+
usage
3162
fi
3263
done
64+
3365
if test -z "$platform" -a \( "$arch" = "arm64" -o "$arch" = "aarch64" \); then
3466
platform=linux/arm64
3567
elif test -z "$platform"; then
3668
platform=linux/amd64
3769
fi
70+
3871
if test -z "$tag" -a "$platform" = linux/arm64; then
3972
tag=cs61:arm64
4073
elif test -z "$tag"; then
4174
tag=cs61:latest
4275
fi
4376

77+
if test -n "$uid"; then
78+
args+=( --build-arg UID="$uid" )
79+
fi
80+
4481
if test $platform = linux/arm64; then
4582
exec docker build -t "$tag" -f Dockerfile.arm64 --platform linux/arm64 ${args[@]} .
4683
else

0 commit comments

Comments
 (0)