Skip to content

Commit 785fda3

Browse files
DEV: slim image, drop unused packages and use cache mounts (#880)
* DEV: slim image, drop unused packages and use cache mounts apt using caches for /var/cache/apt, /var/cache/debconf, and var/lib/apt. Drop autoconf and build-essential from installs, in favor of selective cmake, g++, pkg-config, and patch packages. drop apt-get -y upgrade in dockerfile. We should inherit upgrades from base images. No need to apt-mark hold initscripts now that we're not running `upgrade` Remove calls to vim as we no longer install vim here. Remove comment for slimming locales as we have now done so. merge all apt layers, minimizing amount of --mount arguments in dockerfile
1 parent 7d548ad commit 785fda3

File tree

1 file changed

+53
-51
lines changed

1 file changed

+53
-51
lines changed

image/base/Dockerfile

Lines changed: 53 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -23,56 +23,61 @@ RUN groupadd --gid 104 postgres &&\
2323

2424
RUN echo 2.0.`date +%Y%m%d` > /VERSION
2525
RUN echo "deb http://deb.debian.org/debian ${DEBIAN_RELEASE}-backports main" > "/etc/apt/sources.list.d/${DEBIAN_RELEASE}-backports.list"
26-
RUN echo "debconf debconf/frontend select Teletype" | debconf-set-selections
27-
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -y install gnupg sudo curl fping
28-
RUN sh -c "fping proxy && echo 'Acquire { Retries \"0\"; HTTP { Proxy \"http://proxy:3128\";}; };' > /etc/apt/apt.conf.d/40proxy && apt-get update || true"
29-
RUN apt-mark hold initscripts
30-
RUN apt-get -y upgrade
31-
32-
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y locales
33-
ENV LC_ALL en_US.UTF-8
34-
ENV LANG en_US.UTF-8
35-
ENV LANGUAGE en_US.UTF-8
36-
RUN sed -i "s/^# $LANG/$LANG/" /etc/locale.gen; \
37-
locale-gen
38-
39-
RUN install -d /usr/share/postgresql-common/pgdg &&\
40-
curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc &&\
41-
echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt ${DEBIAN_RELEASE}-pgdg main" > /etc/apt/sources.list.d/pgdg.list
4226

43-
RUN curl --silent --location https://deb.nodesource.com/setup_18.x | sudo bash -
44-
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
45-
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list
46-
RUN apt-get -y update
47-
# install these without recommends to avoid pulling in e.g.
48-
# X11 libraries, mailutils
49-
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends git rsyslog logrotate cron ssh-client less
50-
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install autoconf build-essential ca-certificates rsync \
27+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
28+
--mount=type=cache,target=/var/cache/debconf,sharing=locked \
29+
--mount=type=cache,target=/var/lib/apt,sharing=locked \
30+
--mount=type=tmpfs,target=/var/log \
31+
echo "debconf debconf/frontend select Teletype" | debconf-set-selections; \
32+
apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get -y install gnupg sudo curl fping locales \
33+
ca-certificates rsync \
34+
cmake g++ pkg-config patch \
5135
libxslt-dev libcurl4-openssl-dev \
5236
libssl-dev libyaml-dev libtool \
5337
libpcre3 libpcre3-dev zlib1g zlib1g-dev \
5438
libxml2-dev gawk parallel \
55-
postgresql-${PG_MAJOR} postgresql-client \
56-
postgresql-contrib-${PG_MAJOR} libpq-dev postgresql-${PG_MAJOR}-pgvector \
5739
libreadline-dev anacron wget \
5840
psmisc whois brotli libunwind-dev \
5941
libtcmalloc-minimal4 cmake \
60-
pngcrush pngquant ripgrep poppler-utils
61-
RUN sed -i -e 's/start -q anacron/anacron -s/' /etc/cron.d/anacron
62-
RUN sed -i.bak 's/$ModLoad imklog/#$ModLoad imklog/' /etc/rsyslog.conf
63-
RUN sed -i.bak 's/module(load="imklog")/#module(load="imklog")/' /etc/rsyslog.conf
64-
RUN dpkg-divert --local --rename --add /sbin/initctl
65-
RUN sh -c "test -f /sbin/initctl || ln -s /bin/true /sbin/initctl"
66-
RUN cd / &&\
67-
DEBIAN_FRONTEND=noninteractive apt-get -y install runit socat &&\
68-
mkdir -p /etc/runit/1.d &&\
69-
apt-get clean &&\
70-
rm -f /etc/apt/apt.conf.d/40proxy &&\
71-
DEBIAN_FRONTEND=noninteractive apt-get install -y nodejs yarn &&\
42+
pngcrush pngquant ripgrep poppler-utils; \
43+
# install these without recommends to avoid pulling in e.g.
44+
# X11 libraries, mailutils
45+
DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends git rsyslog logrotate cron ssh-client less; \
46+
# postgres packages
47+
install -d /usr/share/postgresql-common/pgdg &&\
48+
curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc &&\
49+
echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt ${DEBIAN_RELEASE}-pgdg main" > /etc/apt/sources.list.d/pgdg.list; \
50+
# yarn packages
51+
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -; \
52+
echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list; \
53+
# node packages
54+
curl --silent --location https://deb.nodesource.com/setup_18.x | sudo bash -; \
55+
# setup anacron, rsyslog, initctl
56+
sed -i -e 's/start -q anacron/anacron -s/' /etc/cron.d/anacron; \
57+
sed -i.bak 's/$ModLoad imklog/#$ModLoad imklog/' /etc/rsyslog.conf; \
58+
sed -i.bak 's/module(load="imklog")/#module(load="imklog")/' /etc/rsyslog.conf; \
59+
dpkg-divert --local --rename --add /sbin/initctl; \
60+
sh -c "test -f /sbin/initctl || ln -s /bin/true /sbin/initctl"; \
61+
apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get -y install runit socat \
62+
libpq-dev postgresql-client \
63+
postgresql-${PG_MAJOR} postgresql-contrib-${PG_MAJOR} postgresql-${PG_MAJOR}-pgvector \
64+
nodejs yarn &&\
65+
mkdir -p /etc/runit/1.d
66+
67+
ENV LC_ALL=en_US.UTF-8
68+
ENV LANG=en_US.UTF-8
69+
ENV LANGUAGE=en_US.UTF-8
70+
RUN sed -i "s/^# $LANG/$LANG/" /etc/locale.gen; \
71+
locale-gen
72+
73+
RUN --mount=type=tmpfs,target=/root/.npm \
7274
npm install -g terser uglify-js pnpm
7375

7476
ADD install-imagemagick /tmp/install-imagemagick
75-
RUN /tmp/install-imagemagick
77+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
78+
--mount=type=cache,target=/var/cache/debconf,sharing=locked \
79+
--mount=type=cache,target=/var/lib/apt,sharing=locked \
80+
/tmp/install-imagemagick
7681

7782
ADD install-jemalloc /tmp/install-jemalloc
7883
RUN /tmp/install-jemalloc
@@ -81,15 +86,21 @@ RUN /tmp/install-jemalloc
8186
ADD nginx_public_keys.key /tmp/nginx_public_keys.key
8287
ADD install-nginx /tmp/install-nginx
8388

84-
RUN gpg --import /tmp/nginx_public_keys.key &&\
89+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
90+
--mount=type=cache,target=/var/cache/debconf,sharing=locked \
91+
--mount=type=cache,target=/var/lib/apt,sharing=locked \
92+
gpg --import /tmp/nginx_public_keys.key &&\
8593
rm /tmp/nginx_public_keys.key &&\
8694
/tmp/install-nginx
8795

8896
ADD install-redis /tmp/install-redis
8997
RUN /tmp/install-redis
9098

9199
ADD install-oxipng /tmp/install-oxipng
92-
RUN /tmp/install-oxipng
100+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
101+
--mount=type=cache,target=/var/cache/debconf,sharing=locked \
102+
--mount=type=cache,target=/var/lib/apt,sharing=locked \
103+
/tmp/install-oxipng
93104

94105
RUN echo 'gem: --no-document' >> /usr/local/etc/gemrc &&\
95106
gem update --system
@@ -105,22 +116,13 @@ ADD thpoff.c /src/thpoff.c
105116
RUN gcc -o /usr/local/sbin/thpoff /src/thpoff.c && rm /src/thpoff.c
106117

107118
# clean up for docker squash
108-
RUN rm -fr /usr/share/man &&\
109-
rm -fr /usr/share/doc &&\
110-
rm -fr /usr/share/vim/vim74/doc &&\
111-
rm -fr /usr/share/vim/vim74/lang &&\
112-
rm -fr /usr/share/vim/vim74/spell/en* &&\
113-
rm -fr /usr/share/vim/vim74/tutor &&\
114-
rm -fr /usr/local/share/doc &&\
119+
RUN rm -fr /usr/local/share/doc &&\
115120
rm -fr /usr/local/share/ri &&\
116121
rm -fr /var/lib/apt/lists/* &&\
117122
rm -fr /root/.gem &&\
118123
rm -fr /root/.npm &&\
119124
rm -fr /tmp/*
120125

121-
# this can probably be done, but I worry that people changing PG locales will have issues
122-
# cd /usr/share/locale && rm -fr `ls -d */ | grep -v en`
123-
124126
# this is required for aarch64 which uses buildx
125127
# see https://github.com/docker/buildx/issues/150
126128
RUN rm -f /etc/service

0 commit comments

Comments
 (0)