1- # vim:set ft=dockerfile:
2- FROM debian:stretch-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"
1212 libjemalloc1 \
13- # free is used by cassandra-env.sh
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
@@ -22,143 +24,126 @@ RUN set -eux; \
2224 rm -rf /var/lib/apt/lists/*
2325
2426# grab gosu for easy step-down from root
25- ENV GOSU_VERSION 1.10
27+ ENV GOSU_VERSION 1.11
2628RUN set -eux; \
2729 savedAptMark="$(apt-mark showmanual)" ; \
2830 apt-get update; \
29- apt-get install -y --no-install-recommends ca-certificates wget; \
31+ apt-get install -y --no-install-recommends ca-certificates dirmngr gnupg wget; \
3032 rm -rf /var/lib/apt/lists/*; \
31- wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" ; \
32- 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" ; \
3336 export GNUPGHOME="$(mktemp -d)" ; \
3437 gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
3538 gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
3639 gpgconf --kill all; \
3740 rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
38- chmod +x /usr/local/bin/gosu; \
3941 apt-mark auto '.*' > /dev/null; \
40- apt-mark manual $savedAptMark > /dev/null; \
42+ [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
4143 apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
44+ chmod +x /usr/local/bin/gosu; \
45+ gosu --version; \
4246 gosu nobody true
4347
44- # https://wiki.apache.org/cassandra/DebianPackaging#Adding_Repository_Keys
48+ ENV CASSANDRA_HOME /opt/cassandra
49+ ENV CASSANDRA_CONF /etc/cassandra
50+ ENV PATH $CASSANDRA_HOME/bin:$PATH
51+
52+ # https://cwiki.apache.org/confluence/display/CASSANDRA2/DebianPackaging#DebianPackaging-AddingRepositoryKeys
4553ENV GPG_KEYS \
4654# gpg: key 0353B12C: public key "T Jake Luciani <jake@apache.org>" imported
4755 514A2AD631A57A16DD0047EC749D6EEC0353B12C \
4856# gpg: key FE4B2BDA: public key "Michael Shuler <michael@pbandjelly.org>" imported
49- A26E528B271F19B9E5D8E19EA278B781FE4B2BDA
50- RUN set -eux; \
51- export GNUPGHOME="$(mktemp -d)" ; \
52- for key in $GPG_KEYS; do \
53- gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" ; \
54- done; \
55- gpg --batch --export $GPG_KEYS > /etc/apt/trusted.gpg.d/cassandra.gpg; \
56- command -v gpgconf && gpgconf --kill all || :; \
57- rm -rf "$GNUPGHOME" ; \
58- apt-key list
57+ A26E528B271F19B9E5D8E19EA278B781FE4B2BDA \
58+ # gpg: key E91335D77E3E87CB: public key "Michael Semb Wever <mick@thelastpickle.com>" imported
59+ A4C465FEA0C552561A392A61E91335D77E3E87CB
5960
6061ENV CASSANDRA_VERSION 2.1.21
62+ ENV CASSANDRA_SHA512 ea2c35f3f9ce2be8eb96df603927c6867613f3e2215132145da2c3015dd1ddf1370d7196ef4485002e7a54fe22c32abd9c659102057f9297b69113bf83d96d0b
6163
6264RUN 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/*; \
6369 \
64- # https://bugs.debian.org/877677
65- # update-alternatives: error: error creating symbolic link '/usr/share/man/man1/rmid.1.gz.dpkg-tmp': No such file or directory
66- 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+ }; \
6790 \
68- dpkgArch="$(dpkg --print-architecture)" ; \
69- case "$dpkgArch" in \
70- amd64|i386) \
71- # arches officialy included in upstream's repo metadata
72- echo 'deb http://www.apache.org/dist/cassandra/debian 21x main' > /etc/apt/sources.list.d/cassandra.list; \
73- apt-get update; \
74- ;; \
75- *) \
76- # we're on an architecture upstream doesn't include in their repo Architectures
77- # but their provided packages are "Architecture: all" so we can download them directly instead
78- \
79- # save a list of installed packages so build deps can be removed cleanly
80- savedAptMark="$(apt-mark showmanual)" ; \
81- \
82- # fetch a few build dependencies
83- apt-get update; \
84- apt-get install -y --no-install-recommends \
85- wget ca-certificates \
86- dpkg-dev \
87- ; \
88- # we don't remove APT lists here because they get re-downloaded and removed later
89- \
90- # reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
91- # (which is done after we install the built packages so we don't have to redownload any overlapping dependencies)
92- apt-mark showmanual | xargs apt-mark auto > /dev/null; \
93- apt-mark manual $savedAptMark; \
94- \
95- # download the two "arch: all" packages we need
96- tempDir="$(mktemp -d)" ; \
97- for pkg in cassandra cassandra-tools; do \
98- deb="${pkg}_${CASSANDRA_VERSION}_all.deb" ; \
99- wget -O "$tempDir/$deb" "https://www.apache.org/dist/cassandra/debian/pool/main/c/cassandra/$deb" ; \
100- done; \
101- \
102- # create a temporary local APT repo to install from (so that dependency resolution can be handled by APT, as it should be)
103- ls -lAFh "$tempDir" ; \
104- ( cd "$tempDir" && dpkg-scanpackages . > Packages ); \
105- grep '^Package: ' "$tempDir/Packages" ; \
106- echo "deb [ trusted=yes ] file://$tempDir ./" > /etc/apt/sources.list.d/temp.list; \
107- # work around the following APT issue by using "Acquire::GzipIndexes=false" (overriding "/etc/apt/apt.conf.d/docker-gzip-indexes")
108- # Could not open file /var/lib/apt/lists/partial/_tmp_tmp.ODWljpQfkE_._Packages - open (13: Permission denied)
109- # ...
110- # 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)
111- apt-get -o Acquire::GzipIndexes=false update; \
112- ;; \
113- 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 -; \
11493 \
115- apt-get install -y \
116- cassandra="$CASSANDRA_VERSION" \
117- cassandra-tools="$CASSANDRA_VERSION" \
118- ; \
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" ; \
119101 \
120- 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; \
121105 \
122- if [ -n "${tempDir:-}" ]; then \
123- # if we have leftovers from building, let's purge them (including extra, unnecessary build deps)
124- apt-get purge -y --auto-remove; \
125- rm -rf "$tempDir" /etc/apt/sources.list.d/temp.list; \
126- fi
127-
128- ENV CASSANDRA_CONFIG /etc/cassandra
129-
130- 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" ; \
131113 \
132114 dpkgArch="$(dpkg --print-architecture)" ; \
133115 case "$dpkgArch" in \
134116 ppc64el) \
135117# https://issues.apache.org/jira/browse/CASSANDRA-13345
136118# "The stack size specified is too small, Specify at least 328k"
137- if grep -q -- '^-Xss' "$CASSANDRA_CONFIG /jvm.options" ; then \
119+ if grep -q -- '^-Xss' "$CASSANDRA_CONF /jvm.options" ; then \
138120# 3.11+ (jvm.options)
139- grep -- '^-Xss256k$' "$CASSANDRA_CONFIG /jvm.options" ; \
140- sed -ri 's/^-Xss256k$/-Xss512k/' "$CASSANDRA_CONFIG /jvm.options" ; \
141- grep -- '^-Xss512k$' "$CASSANDRA_CONFIG /jvm.options" ; \
142- 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 \
143125# 3.0 (cassandra-env.sh)
144- sed -ri 's/-Xss256k/-Xss512k/g' "$CASSANDRA_CONFIG /cassandra-env.sh" ; \
145- 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" ; \
146128 fi; \
147129 ;; \
148130 esac; \
149131 \
150- # https://issues.apache.org/jira/browse/CASSANDRA-11661
151- 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
152142
153143COPY docker-entrypoint.sh /usr/local/bin/
154144RUN ln -s usr/local/bin/docker-entrypoint.sh /docker-entrypoint.sh # backwards compat
155145ENTRYPOINT ["docker-entrypoint.sh" ]
156146
157- RUN mkdir -p /var/lib/cassandra "$CASSANDRA_CONFIG" \
158- && chown -R cassandra:cassandra /var/lib/cassandra "$CASSANDRA_CONFIG" \
159- && chmod 777 /var/lib/cassandra "$CASSANDRA_CONFIG"
160- VOLUME /var/lib/cassandra
161-
162147# 7000: intra-node communication
163148# 7001: TLS intra-node communication
164149# 7199: JMX
0 commit comments