1- # vim:set ft=dockerfile:
2- FROM debian:buster-slim
1+ FROM adoptopenjdk:8-jre-hotspot-bionic
32
43# explicitly set user/group IDs
5- RUN groupadd -r cassandra --gid=999 && useradd -r -g cassandra --uid=999 cassandra
4+ RUN set -eux; \
5+ groupadd -r cassandra --gid=999; \
6+ useradd -r -g cassandra --uid=999 cassandra
67
78RUN set -eux; \
89 apt-get update; \
910 apt-get install -y --no-install-recommends \
10- gnupg dirmngr \
1111# solves warning: "jemalloc shared library could not be preloaded to speed up memory allocations"
12- libjemalloc2 \
13- # free is used by cassandra-env.sh
12+ libjemalloc1 \
13+ # " free" is used by cassandra-env.sh
1414 procps \
15+ # "cqlsh" needs a python interpreter
16+ python \
1517# "ip" is not required by Cassandra itself, but is commonly used in scripting Cassandra's configuration (since it is so fixated on explicit IP addresses)
1618 iproute2 \
1719# Cassandra will automatically use numactl if available
1820# https://github.com/apache/cassandra/blob/18bcda2d4c2eba7370a0b21f33eed37cb730bbb3/bin/cassandra#L90-L100
1921# https://github.com/apache/cassandra/commit/604c0e87dc67fa65f6904ef9a98a029c9f2f865a
2022 numactl \
21- # Cassandra's APT repository is served over https
22- ca-certificates \
2323 ; \
2424 rm -rf /var/lib/apt/lists/*
2525
2626# grab gosu for easy step-down from root
27- ENV GOSU_VERSION 1.10
27+ ENV GOSU_VERSION 1.11
2828RUN set -eux; \
2929 savedAptMark="$(apt-mark showmanual)" ; \
3030 apt-get update; \
31- apt-get install -y --no-install-recommends ca-certificates wget; \
31+ apt-get install -y --no-install-recommends ca-certificates dirmngr gnupg wget; \
3232 rm -rf /var/lib/apt/lists/*; \
33- wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" ; \
34- wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" ; \
33+ dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" ; \
34+ wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" ; \
35+ wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc" ; \
3536 export GNUPGHOME="$(mktemp -d)" ; \
3637 gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
3738 gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
3839 gpgconf --kill all; \
3940 rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
40- chmod +x /usr/local/bin/gosu; \
4141 apt-mark auto '.*' > /dev/null; \
42- apt-mark manual $savedAptMark > /dev/null; \
42+ [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
4343 apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
44+ chmod +x /usr/local/bin/gosu; \
45+ gosu --version; \
4446 gosu nobody true
4547
48+ ENV CASSANDRA_HOME /opt/cassandra
49+ ENV CASSANDRA_CONF /etc/cassandra
50+ ENV PATH $CASSANDRA_HOME/bin:$PATH
51+
4652# https://cwiki.apache.org/confluence/display/CASSANDRA2/DebianPackaging#DebianPackaging-AddingRepositoryKeys
4753ENV GPG_KEYS \
4854# gpg: key 0353B12C: public key "T Jake Luciani <jake@apache.org>" imported
@@ -51,118 +57,93 @@ ENV GPG_KEYS \
5157 A26E528B271F19B9E5D8E19EA278B781FE4B2BDA \
5258# gpg: key E91335D77E3E87CB: public key "Michael Semb Wever <mick@thelastpickle.com>" imported
5359 A4C465FEA0C552561A392A61E91335D77E3E87CB
54- RUN set -eux; \
55- export GNUPGHOME="$(mktemp -d)" ; \
56- for key in $GPG_KEYS; do \
57- gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" ; \
58- done; \
59- gpg --batch --export $GPG_KEYS > /etc/apt/trusted.gpg.d/cassandra.gpg; \
60- command -v gpgconf && gpgconf --kill all || :; \
61- rm -rf "$GNUPGHOME" ; \
62- apt-key list
6360
6461ENV CASSANDRA_VERSION 2.1.21
62+ ENV CASSANDRA_SHA512 ea2c35f3f9ce2be8eb96df603927c6867613f3e2215132145da2c3015dd1ddf1370d7196ef4485002e7a54fe22c32abd9c659102057f9297b69113bf83d96d0b
6563
6664RUN set -eux; \
65+ savedAptMark="$(apt-mark showmanual)" ; \
66+ apt-get update; \
67+ apt-get install -y --no-install-recommends ca-certificates dirmngr gnupg wget; \
68+ rm -rf /var/lib/apt/lists/*; \
6769 \
68- # https://bugs.debian.org/877677
69- # update-alternatives: error: error creating symbolic link '/usr/share/man/man1/rmid.1.gz.dpkg-tmp': No such file or directory
70- mkdir -p /usr/share/man/man1/; \
70+ ddist() { \
71+ local f="$1" ; shift; \
72+ local distFile="$1" ; shift; \
73+ local success=; \
74+ local distUrl=; \
75+ for distUrl in \
76+ # https://issues.apache.org/jira/browse/INFRA-8753?focusedCommentId=14735394#comment-14735394
77+ 'https://www.apache.org/dyn/closer.cgi?action=download&filename=' \
78+ # if the version is outdated (or we're grabbing the .asc file), we might have to pull from the dist/archive :/
79+ https://www-us.apache.org/dist/ \
80+ https://www.apache.org/dist/ \
81+ https://archive.apache.org/dist/ \
82+ ; do \
83+ if wget --progress=dot:giga -O "$f" "$distUrl$distFile" && [ -s "$f" ]; then \
84+ success=1; \
85+ break; \
86+ fi; \
87+ done; \
88+ [ -n "$success" ]; \
89+ }; \
7190 \
72- dpkgArch="$(dpkg --print-architecture)" ; \
73- case "$dpkgArch" in \
74- amd64|i386) \
75- # arches officialy included in upstream's repo metadata
76- echo 'deb https://downloads.apache.org/cassandra/debian 21x main' > /etc/apt/sources.list.d/cassandra.list; \
77- apt-get update; \
78- ;; \
79- *) \
80- # we're on an architecture upstream doesn't include in their repo Architectures
81- # but their provided packages are "Architecture: all" so we can download them directly instead
82- \
83- # save a list of installed packages so build deps can be removed cleanly
84- savedAptMark="$(apt-mark showmanual)" ; \
85- \
86- # fetch a few build dependencies
87- apt-get update; \
88- apt-get install -y --no-install-recommends \
89- wget ca-certificates \
90- dpkg-dev \
91- ; \
92- # we don't remove APT lists here because they get re-downloaded and removed later
93- \
94- # reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
95- # (which is done after we install the built packages so we don't have to redownload any overlapping dependencies)
96- apt-mark showmanual | xargs apt-mark auto > /dev/null; \
97- apt-mark manual $savedAptMark; \
98- \
99- # download the two "arch: all" packages we need
100- tempDir="$(mktemp -d)" ; \
101- for pkg in cassandra cassandra-tools; do \
102- deb="${pkg}_${CASSANDRA_VERSION}_all.deb" ; \
103- wget -O "$tempDir/$deb" "https://downloads.apache.org/cassandra/debian/pool/main/c/cassandra/$deb" ; \
104- done; \
105- \
106- # create a temporary local APT repo to install from (so that dependency resolution can be handled by APT, as it should be)
107- ls -lAFh "$tempDir" ; \
108- ( cd "$tempDir" && dpkg-scanpackages . > Packages ); \
109- grep '^Package: ' "$tempDir/Packages" ; \
110- echo "deb [ trusted=yes ] file://$tempDir ./" > /etc/apt/sources.list.d/temp.list; \
111- # work around the following APT issue by using "Acquire::GzipIndexes=false" (overriding "/etc/apt/apt.conf.d/docker-gzip-indexes")
112- # Could not open file /var/lib/apt/lists/partial/_tmp_tmp.ODWljpQfkE_._Packages - open (13: Permission denied)
113- # ...
114- # E: Failed to fetch store:/var/lib/apt/lists/partial/_tmp_tmp.ODWljpQfkE_._Packages Could not open file /var/lib/apt/lists/partial/_tmp_tmp.ODWljpQfkE_._Packages - open (13: Permission denied)
115- apt-get -o Acquire::GzipIndexes=false update; \
116- ;; \
117- esac; \
91+ ddist 'cassandra-bin.tgz' "cassandra/$CASSANDRA_VERSION/apache-cassandra-$CASSANDRA_VERSION-bin.tar.gz" ; \
92+ echo "$CASSANDRA_SHA512 *cassandra-bin.tgz" | sha512sum --check --strict -; \
11893 \
119- apt-get install -y \
120- cassandra="$CASSANDRA_VERSION" \
121- cassandra-tools="$CASSANDRA_VERSION" \
122- ; \
94+ ddist 'cassandra-bin.tgz.asc' "cassandra/$CASSANDRA_VERSION/apache-cassandra-$CASSANDRA_VERSION-bin.tar.gz.asc" ; \
95+ export GNUPGHOME="$(mktemp -d)" ; \
96+ for key in $GPG_KEYS; do \
97+ gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" ; \
98+ done; \
99+ gpg --batch --verify cassandra-bin.tgz.asc cassandra-bin.tgz; \
100+ rm -rf "$GNUPGHOME" ; \
123101 \
124- rm -rf /var/lib/apt/lists/*; \
102+ apt-mark auto '.*' > /dev/null; \
103+ [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
104+ apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
125105 \
126- if [ -n "${tempDir:-}" ]; then \
127- # if we have leftovers from building, let's purge them (including extra, unnecessary build deps)
128- apt-get purge -y --auto-remove; \
129- rm -rf "$tempDir" /etc/apt/sources.list.d/temp.list; \
130- fi
131-
132- ENV CASSANDRA_CONFIG /etc/cassandra
133-
134- RUN set -eux; \
106+ mkdir -p "$CASSANDRA_HOME" ; \
107+ tar --extract --file cassandra-bin.tgz --directory "$CASSANDRA_HOME" --strip-components 1; \
108+ rm cassandra-bin.tgz*; \
109+ \
110+ [ ! -e "$CASSANDRA_CONF" ]; \
111+ mv "$CASSANDRA_HOME/conf" "$CASSANDRA_CONF" ; \
112+ ln -sT "$CASSANDRA_CONF" "$CASSANDRA_HOME/conf" ; \
135113 \
136114 dpkgArch="$(dpkg --print-architecture)" ; \
137115 case "$dpkgArch" in \
138116 ppc64el) \
139117# https://issues.apache.org/jira/browse/CASSANDRA-13345
140118# "The stack size specified is too small, Specify at least 328k"
141- if grep -q -- '^-Xss' "$CASSANDRA_CONFIG /jvm.options" ; then \
119+ if grep -q -- '^-Xss' "$CASSANDRA_CONF /jvm.options" ; then \
142120# 3.11+ (jvm.options)
143- grep -- '^-Xss256k$' "$CASSANDRA_CONFIG /jvm.options" ; \
144- sed -ri 's/^-Xss256k$/-Xss512k/' "$CASSANDRA_CONFIG /jvm.options" ; \
145- grep -- '^-Xss512k$' "$CASSANDRA_CONFIG /jvm.options" ; \
146- elif grep -q -- '-Xss256k' "$CASSANDRA_CONFIG /cassandra-env.sh" ; then \
121+ grep -- '^-Xss256k$' "$CASSANDRA_CONF /jvm.options" ; \
122+ sed -ri 's/^-Xss256k$/-Xss512k/' "$CASSANDRA_CONF /jvm.options" ; \
123+ grep -- '^-Xss512k$' "$CASSANDRA_CONF /jvm.options" ; \
124+ elif grep -q -- '-Xss256k' "$CASSANDRA_CONF /cassandra-env.sh" ; then \
147125# 3.0 (cassandra-env.sh)
148- sed -ri 's/-Xss256k/-Xss512k/g' "$CASSANDRA_CONFIG /cassandra-env.sh" ; \
149- grep -- '-Xss512k' "$CASSANDRA_CONFIG /cassandra-env.sh" ; \
126+ sed -ri 's/-Xss256k/-Xss512k/g' "$CASSANDRA_CONF /cassandra-env.sh" ; \
127+ grep -- '-Xss512k' "$CASSANDRA_CONF /cassandra-env.sh" ; \
150128 fi; \
151129 ;; \
152130 esac; \
153131 \
154- # https://issues.apache.org/jira/browse/CASSANDRA-11661
155- sed -ri 's/^(JVM_PATCH_VERSION)=.*/\1 =25/' "$CASSANDRA_CONFIG/cassandra-env.sh"
132+ mkdir -p "$CASSANDRA_CONF" /var/lib/cassandra /var/log/cassandra; \
133+ chown -R cassandra:cassandra "$CASSANDRA_CONF" /var/lib/cassandra /var/log/cassandra; \
134+ chmod 777 "$CASSANDRA_CONF" /var/lib/cassandra /var/log/cassandra; \
135+ ln -sT /var/lib/cassandra "$CASSANDRA_HOME/data" ; \
136+ ln -sT /var/log/cassandra "$CASSANDRA_HOME/logs" ; \
137+ \
138+ # smoke test
139+ cassandra -v
140+
141+ VOLUME /var/lib/cassandra
156142
157143COPY docker-entrypoint.sh /usr/local/bin/
158144RUN ln -s usr/local/bin/docker-entrypoint.sh /docker-entrypoint.sh # backwards compat
159145ENTRYPOINT ["docker-entrypoint.sh" ]
160146
161- RUN mkdir -p /var/lib/cassandra "$CASSANDRA_CONFIG" \
162- && chown -R cassandra:cassandra /var/lib/cassandra "$CASSANDRA_CONFIG" \
163- && chmod 777 /var/lib/cassandra "$CASSANDRA_CONFIG"
164- VOLUME /var/lib/cassandra
165-
166147# 7000: intra-node communication
167148# 7001: TLS intra-node communication
168149# 7199: JMX
0 commit comments