1
0
mirror of https://github.com/kylemanna/docker-aosp synced 2025-06-07 07:56:25 +00:00

utils/aosp: Update script and Dockerfile to work with any host user uid/gid

This commit introduces the "docker_entrypoint" script that will create
a user with uid/gid matching given `USER_ID` and `GROUP_ID` (or default to
`1000` if not provided).

Fixes #9

This approach works around missing docker feature discussed in
docker/docker#7198 and allow to have executable in the docker container
manipulating files in the shared volume owned by the `USER_ID:GROUP_ID`

The utility script `aosp` has also been updated to automatically
set `USER_ID` and `GROUP_ID` to the value matching the current user
by invoking "docker run" with

```
-e USER_ID=$(id -u) -e GROUP_ID=$(id -g)
```

Finally, the output has also been updated to be more verbose. For example:

```
$ AOSP_VOL=/home/jcfr/Projects/aosp-root/ aosp id
aosp: Checking if /home/jcfr/Projects/aosp-root/aosp exists
aosp: Checking if /home/jcfr/Projects/aosp-root/aosp exists - ok
aosp: Checking if /home/jcfr/Projects/aosp-root/ccache exists
aosp: Checking if /home/jcfr/Projects/aosp-root/ccache exists - ok

docker_entrypoint: Creating user UID/GID [1000/1000]
docker_entrypoint: Creating user UID/GID [1000/1000] - done
docker_entrypoint: Copying .gitconfig and .ssh/config to new user home
docker_entrypoint: Copying .gitconfig and .ssh/config to new user home - done
docker_entrypoint: Creating /tmp/ccache and /asop directory
docker_entrypoint: Creating /tmp/ccache and /asop directory - done

uid=1000(aosp) gid=1000(aosp) groups=1000(aosp)
```
This commit is contained in:
Jean-Christophe Fillion-Robin 2016-04-20 13:08:40 -04:00
parent 2ee12e4ebb
commit 91ae4a8cdc
3 changed files with 53 additions and 11 deletions

View File

@ -43,14 +43,8 @@ RUN curl -O http://mirrors.kernel.org/ubuntu/pool/universe/o/openjdk-8/openjdk-8
apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# All builds will be done by user aosp # All builds will be done by user aosp
RUN groupadd -r aosp && useradd --create-home -g aosp aosp COPY gitconfig /root/.gitconfig
COPY gitconfig /home/aosp/.gitconfig COPY ssh_config /root/.ssh/config
COPY ssh_config /home/aosp/.ssh/config
RUN chown aosp:aosp /home/aosp/.gitconfig && \
chown aosp:aosp -R /home/aosp/.ssh
RUN mkdir -p /tmp/ccache /aosp && \
chown aosp:aosp /tmp/ccache /aosp
# The persistent data will be in these two directories, everything else is # The persistent data will be in these two directories, everything else is
# considered to be ephemeral # considered to be ephemeral
@ -61,5 +55,7 @@ ENV USE_CCACHE 1
ENV CCACHE_DIR /tmp/ccache ENV CCACHE_DIR /tmp/ccache
# Work in the build directory, repo is expected to be init'd here # Work in the build directory, repo is expected to be init'd here
USER aosp
WORKDIR /aosp WORKDIR /aosp
COPY utils/docker_entrypoint.sh /root/docker_entrypoint.sh
ENTRYPOINT ["/root/docker_entrypoint.sh"]

View File

@ -22,7 +22,7 @@ AOSP_VOL_CCACHE=${AOSP_VOL_CCACHE%/} # Trim trailing slash if needed
# Convenience function # Convenience function
function aosp_create_dir_if_needed { function aosp_create_dir_if_needed {
directory=$1 directory=$1
msg="Checking if $directory exists" msg="aosp: Checking if $directory exists"
echo "$msg" echo "$msg"
if [ ! -d "$directory" ]; then if [ ! -d "$directory" ]; then
echo "$msg - unexistent" echo "$msg - unexistent"
@ -37,12 +37,15 @@ function aosp_create_dir_if_needed {
aosp_create_dir_if_needed $AOSP_VOL_AOSP aosp_create_dir_if_needed $AOSP_VOL_AOSP
aosp_create_dir_if_needed $AOSP_VOL_CCACHE aosp_create_dir_if_needed $AOSP_VOL_CCACHE
# Set uid and gid to match host current user
AOSP_HOST_ID_ARGS="-e USER_ID=$(id -u) -e GROUP_ID=$(id -g)"
if [ -n "$SSH_AUTH_SOCK" ]; then if [ -n "$SSH_AUTH_SOCK" ]; then
SSH_AUTH_ARGS="-v $SSH_AUTH_SOCK:/tmp/ssh_auth -e SSH_AUTH_SOCK=/tmp/ssh_auth" SSH_AUTH_ARGS="-v $SSH_AUTH_SOCK:/tmp/ssh_auth -e SSH_AUTH_SOCK=/tmp/ssh_auth"
fi fi
echo "" echo ""
docker run $AOSP_ARGS $SSH_AUTH_ARGS $AOSP_EXTRA_ARGS \ docker run $AOSP_ARGS $AOSP_HOST_ID_ARGS $SSH_AUTH_ARGS $AOSP_EXTRA_ARGS \
-v "$AOSP_VOL_AOSP:/aosp" -v "$AOSP_VOL_CCACHE:/tmp/ccache" \ -v "$AOSP_VOL_AOSP:/aosp" -v "$AOSP_VOL_CCACHE:/tmp/ccache" \
$AOSP_IMAGE $@ $AOSP_IMAGE $@

43
utils/docker_entrypoint.sh Executable file
View File

@ -0,0 +1,43 @@
#!/bin/bash
set -e
# This script designed to be used a docker ENTRYPOINT "workaround" missing docker
# feature discussed in docker/docker#7198, allow to have executable in the docker
# container manipulating files in the shared volume owned by the USER_ID:GROUP_ID.
#
# It creates a user named `aosp` with selected USER_ID and GROUP_ID (or
# 1000 if not specified).
# Example:
#
# docker run -ti -e USER_ID=$(id -u) -e GROUP_ID=$(id -g) imagename bash
#
# Reasonable defaults if no USER_ID/GROUP_ID environment variables are set.
if [ -z ${USER_ID+x} ]; then USER_ID=1000; fi
if [ -z ${GROUP_ID+x} ]; then GROUP_ID=1000; fi
msg="docker_entrypoint: Creating user UID/GID [$USER_ID/$GROUP_ID]" && echo $msg
groupadd -g $GROUP_ID -r aosp && \
useradd -u $USER_ID --create-home -r -g aosp aosp
echo "$msg - done"
msg="docker_entrypoint: Copying .gitconfig and .ssh/config to new user home" && echo $msg
cp /root/.gitconfig /home/aosp/.gitconfig && \
chown aosp:aosp /home/aosp/.gitconfig && \
mkdir -p /home/aosp/.ssh && \
cp /root/.ssh/config /home/aosp/.ssh/config && \
chown aosp:aosp -R /home/aosp/.ssh &&
echo "$msg - done"
msg="docker_entrypoint: Creating /tmp/ccache and /asop directory" && echo $msg
mkdir -p /tmp/ccache /aosp
chown aosp:aosp /tmp/ccache /aosp
echo "$msg - done"
echo ""
# Execute command as `aosp` user
export HOME=/home/aosp
exec sudo -u aosp "$@"