Skip to content

Commit edca91b

Browse files
fix(builder): Non-root slugrunner and slugbuilder
This improves the compatibility to heroku and stops running apps as root
1 parent c092fed commit edca91b

5 files changed

Lines changed: 35 additions & 14 deletions

File tree

builder/Dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ ENTRYPOINT ["/app/bin/entry"]
5959
CMD ["/app/bin/boot"]
6060
EXPOSE 22
6161

62+
RUN addgroup --quiet --gid 2000 slug && useradd slug --uid=2000 --gid=2000
63+
6264
ADD . /app
6365
ADD sshd_config /etc/ssh/sshd_config
6466
RUN chown -R root:root /app

builder/slugbuilder/Dockerfile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
FROM progrium/cedarish:cedar
22
MAINTAINER OpDemand <info@opdemand.com>
33

4-
RUN useradd slugbuilder --home-dir /app
4+
RUN mkdir /app
5+
RUN addgroup --quiet --gid 2000 slug && \
6+
useradd slug --uid=2000 --gid=2000 --home-dir /app --no-create-home
7+
RUN chown -R slug:slug /app
8+
USER slug
9+
ENV HOME /app
510

611
ADD ./builder/ /tmp/builder
712
RUN /tmp/builder/install-buildpacks

builder/slugbuilder/builder/build.sh

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,6 @@ fi
5050
# buildpacks expect that.
5151
cp -r $app_dir/. $build_root
5252

53-
# Grant the slugbuilder user access to all relevant
54-
# directories, then run the rest as slugbuilder
55-
chown -R slugbuilder:slugbuilder $app_dir \
56-
$cache_root \
57-
$buildpack_root \
58-
$build_root
59-
su slugbuilder
60-
6153
## Buildpack fixes
6254

6355
export APP_DIR="$app_dir"

builder/slugrunner/Dockerfile

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
11
FROM progrium/cedarish:cedar
22
MAINTAINER OpDemand <info@opdemand.com>
33

4-
ADD ./runner /runner
5-
ENTRYPOINT ["/runner/init"]
4+
RUN mkdir /app
5+
RUN addgroup --quiet --gid 2000 slug && \
6+
useradd slug --uid=2000 --gid=2000 --home-dir /app --no-create-home \
7+
--shell /bin/bash
8+
RUN chown slug:slug /app
9+
WORKDIR /app
610

711
# add default port to expose (can be overridden)
812
ENV PORT 5000
913
EXPOSE 5000
14+
15+
ADD ./runner /runner
16+
RUN chown slug:slug /runner/init
17+
USER slug
18+
ENV HOME /app
19+
ENTRYPOINT ["/runner/init"]

builder/templates/builder

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,16 @@ def parse_args():
2525
return user, repo, branch, app
2626

2727

28+
def recursive_chown(path, uid, guid):
29+
os.chown(os.path.join(path), uid, guid)
30+
for root, dirs, files in os.walk(path):
31+
for d in dirs:
32+
os.chown(os.path.join(root, d), uid, guid)
33+
for f in files:
34+
os.chown(os.path.join(root, f), uid, guid)
35+
36+
2837
DOCKERFILE_SHIM = """FROM deis/slugrunner
29-
RUN mkdir -p /app
30-
WORKDIR /app
31-
ENTRYPOINT ["/runner/init"]
3238
ADD slug.tgz /app
3339
"""
3440

@@ -73,7 +79,13 @@ if __name__ == '__main__':
7379
config_env = " ".join([ "-e {}='{}'".format(*kv) for kv in json.loads(r.json().get('values', '{}')).items()])
7480
# some applications do not have a Procfile, so only check for a Dockerfile
7581
if not os.path.exists(dockerfile):
82+
# fix permissions
83+
slug_uid = 2000
84+
slug_guid = 2000
85+
for path in (cache_dir, temp_dir):
86+
recursive_chown(path, slug_uid, slug_guid)
7687
if os.path.exists('/buildpacks'):
88+
recursive_chown('/buildpacks', slug_uid, slug_guid)
7789
build_cmd = "docker run -i -a stdin {config_env} -v {temp_dir}:/tmp/app -v {cache_dir}:/tmp/cache:rw -v /buildpacks:/tmp/buildpacks deis/slugbuilder".format(**locals())
7890
else:
7991
build_cmd = "docker run -i -a stdin {config_env} -v {temp_dir}:/tmp/app -v {cache_dir}:/tmp/cache:rw deis/slugbuilder".format(**locals())

0 commit comments

Comments
 (0)