diff --git a/Dockerfile b/Dockerfile index 7fb45cb..c238644 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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/* # All builds will be done by user aosp -RUN groupadd -r aosp && useradd --create-home -g aosp aosp -COPY gitconfig /home/aosp/.gitconfig -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 +COPY gitconfig /root/.gitconfig +COPY ssh_config /root/.ssh/config # The persistent data will be in these two directories, everything else is # considered to be ephemeral @@ -61,5 +55,7 @@ ENV USE_CCACHE 1 ENV CCACHE_DIR /tmp/ccache # Work in the build directory, repo is expected to be init'd here -USER aosp WORKDIR /aosp + +COPY utils/docker_entrypoint.sh /root/docker_entrypoint.sh +ENTRYPOINT ["/root/docker_entrypoint.sh"] diff --git a/utils/aosp b/utils/aosp index 29c8e5d..b97cbf4 100755 --- a/utils/aosp +++ b/utils/aosp @@ -22,7 +22,7 @@ AOSP_VOL_CCACHE=${AOSP_VOL_CCACHE%/} # Trim trailing slash if needed # Convenience function function aosp_create_dir_if_needed { directory=$1 - msg="Checking if $directory exists" + msg="aosp: Checking if $directory exists" echo "$msg" if [ ! -d "$directory" ]; then 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_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 SSH_AUTH_ARGS="-v $SSH_AUTH_SOCK:/tmp/ssh_auth -e SSH_AUTH_SOCK=/tmp/ssh_auth" fi 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" \ $AOSP_IMAGE $@ diff --git a/utils/docker_entrypoint.sh b/utils/docker_entrypoint.sh new file mode 100755 index 0000000..8862c53 --- /dev/null +++ b/utils/docker_entrypoint.sh @@ -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 "$@"