Skip to content

Commit f6ffec9

Browse files
authored
Merge pull request #212 from cscetbon/master
Add cassandra 4.0
2 parents a39fcee + d7cb5f1 commit f6ffec9

File tree

3 files changed

+248
-3
lines changed

3 files changed

+248
-3
lines changed

4.0/Dockerfile

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
FROM adoptopenjdk:11-jre-hotspot-bionic
2+
3+
# explicitly set user/group IDs
4+
RUN set -eux; \
5+
groupadd -r cassandra --gid=999; \
6+
useradd -r -g cassandra --uid=999 cassandra
7+
8+
RUN set -eux; \
9+
apt-get update; \
10+
apt-get install -y --no-install-recommends \
11+
# solves warning: "jemalloc shared library could not be preloaded to speed up memory allocations"
12+
libjemalloc1 \
13+
# "free" is used by cassandra-env.sh
14+
procps \
15+
# "cqlsh" needs a python interpreter
16+
python3 \
17+
# "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)
18+
iproute2 \
19+
# Cassandra will automatically use numactl if available
20+
# https://github.com/apache/cassandra/blob/18bcda2d4c2eba7370a0b21f33eed37cb730bbb3/bin/cassandra#L90-L100
21+
# https://github.com/apache/cassandra/commit/604c0e87dc67fa65f6904ef9a98a029c9f2f865a
22+
numactl \
23+
; \
24+
rm -rf /var/lib/apt/lists/*
25+
26+
# grab gosu for easy step-down from root
27+
# https://github.com/tianon/gosu/releases
28+
ENV GOSU_VERSION 1.12
29+
RUN set -eux; \
30+
savedAptMark="$(apt-mark showmanual)"; \
31+
apt-get update; \
32+
apt-get install -y --no-install-recommends ca-certificates dirmngr gnupg wget; \
33+
rm -rf /var/lib/apt/lists/*; \
34+
dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
35+
wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \
36+
wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \
37+
export GNUPGHOME="$(mktemp -d)"; \
38+
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
39+
gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
40+
gpgconf --kill all; \
41+
rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
42+
apt-mark auto '.*' > /dev/null; \
43+
[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
44+
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
45+
chmod +x /usr/local/bin/gosu; \
46+
gosu --version; \
47+
gosu nobody true
48+
49+
ENV CASSANDRA_HOME /opt/cassandra
50+
ENV CASSANDRA_CONF /etc/cassandra
51+
ENV PATH $CASSANDRA_HOME/bin:$PATH
52+
53+
# https://cwiki.apache.org/confluence/display/CASSANDRA2/DebianPackaging#DebianPackaging-AddingRepositoryKeys
54+
ENV GPG_KEYS \
55+
# gpg: key 0353B12C: public key "T Jake Luciani <[email protected]>" imported
56+
514A2AD631A57A16DD0047EC749D6EEC0353B12C \
57+
# gpg: key FE4B2BDA: public key "Michael Shuler <[email protected]>" imported
58+
A26E528B271F19B9E5D8E19EA278B781FE4B2BDA \
59+
# gpg: key E91335D77E3E87CB: public key "Michael Semb Wever <[email protected]>" imported
60+
A4C465FEA0C552561A392A61E91335D77E3E87CB
61+
62+
ENV CASSANDRA_VERSION 4.0-beta1
63+
ENV CASSANDRA_SHA512 240ae95f78de172333eee865f01b838433845fbd0dceea0eb91ea3a419873f74c5e266cfb62553fa0260849afa7ec5cc65335d037d1455e36b96ddc0f18effc7
64+
65+
RUN set -eux; \
66+
savedAptMark="$(apt-mark showmanual)"; \
67+
apt-get update; \
68+
apt-get install -y --no-install-recommends ca-certificates dirmngr gnupg wget; \
69+
rm -rf /var/lib/apt/lists/*; \
70+
\
71+
ddist() { \
72+
local f="$1"; shift; \
73+
local distFile="$1"; shift; \
74+
local success=; \
75+
local distUrl=; \
76+
for distUrl in \
77+
# https://issues.apache.org/jira/browse/INFRA-8753?focusedCommentId=14735394#comment-14735394
78+
'https://www.apache.org/dyn/closer.cgi?action=download&filename=' \
79+
# if the version is outdated (or we're grabbing the .asc file), we might have to pull from the dist/archive :/
80+
https://www-us.apache.org/dist/ \
81+
https://www.apache.org/dist/ \
82+
https://archive.apache.org/dist/ \
83+
; do \
84+
if wget --progress=dot:giga -O "$f" "$distUrl$distFile" && [ -s "$f" ]; then \
85+
success=1; \
86+
break; \
87+
fi; \
88+
done; \
89+
[ -n "$success" ]; \
90+
}; \
91+
\
92+
ddist 'cassandra-bin.tgz' "cassandra/$CASSANDRA_VERSION/apache-cassandra-$CASSANDRA_VERSION-bin.tar.gz"; \
93+
echo "$CASSANDRA_SHA512 *cassandra-bin.tgz" | sha512sum --check --strict -; \
94+
\
95+
ddist 'cassandra-bin.tgz.asc' "cassandra/$CASSANDRA_VERSION/apache-cassandra-$CASSANDRA_VERSION-bin.tar.gz.asc"; \
96+
export GNUPGHOME="$(mktemp -d)"; \
97+
for key in $GPG_KEYS; do \
98+
gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
99+
done; \
100+
gpg --batch --verify cassandra-bin.tgz.asc cassandra-bin.tgz; \
101+
rm -rf "$GNUPGHOME"; \
102+
\
103+
apt-mark auto '.*' > /dev/null; \
104+
[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
105+
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
106+
\
107+
mkdir -p "$CASSANDRA_HOME"; \
108+
tar --extract --file cassandra-bin.tgz --directory "$CASSANDRA_HOME" --strip-components 1; \
109+
rm cassandra-bin.tgz*; \
110+
\
111+
[ ! -e "$CASSANDRA_CONF" ]; \
112+
mv "$CASSANDRA_HOME/conf" "$CASSANDRA_CONF"; \
113+
ln -sT "$CASSANDRA_CONF" "$CASSANDRA_HOME/conf"; \
114+
\
115+
dpkgArch="$(dpkg --print-architecture)"; \
116+
case "$dpkgArch" in \
117+
ppc64el) \
118+
# https://issues.apache.org/jira/browse/CASSANDRA-13345
119+
# "The stack size specified is too small, Specify at least 328k"
120+
if grep -q -- '^-Xss' "$CASSANDRA_CONF/jvm.options"; then \
121+
# 3.11+ (jvm.options)
122+
grep -- '^-Xss256k$' "$CASSANDRA_CONF/jvm.options"; \
123+
sed -ri 's/^-Xss256k$/-Xss512k/' "$CASSANDRA_CONF/jvm.options"; \
124+
grep -- '^-Xss512k$' "$CASSANDRA_CONF/jvm.options"; \
125+
elif grep -q -- '-Xss256k' "$CASSANDRA_CONF/cassandra-env.sh"; then \
126+
# 3.0 (cassandra-env.sh)
127+
sed -ri 's/-Xss256k/-Xss512k/g' "$CASSANDRA_CONF/cassandra-env.sh"; \
128+
grep -- '-Xss512k' "$CASSANDRA_CONF/cassandra-env.sh"; \
129+
fi; \
130+
;; \
131+
esac; \
132+
\
133+
mkdir -p "$CASSANDRA_CONF" /var/lib/cassandra /var/log/cassandra; \
134+
chown -R cassandra:cassandra "$CASSANDRA_CONF" /var/lib/cassandra /var/log/cassandra; \
135+
chmod 777 "$CASSANDRA_CONF" /var/lib/cassandra /var/log/cassandra; \
136+
ln -sT /var/lib/cassandra "$CASSANDRA_HOME/data"; \
137+
ln -sT /var/log/cassandra "$CASSANDRA_HOME/logs"; \
138+
\
139+
# smoke test
140+
cassandra -v
141+
142+
VOLUME /var/lib/cassandra
143+
144+
COPY docker-entrypoint.sh /usr/local/bin/
145+
ENTRYPOINT ["docker-entrypoint.sh"]
146+
147+
# 7000: intra-node communication
148+
# 7001: TLS intra-node communication
149+
# 7199: JMX
150+
# 9042: CQL
151+
# 9160: thrift service
152+
EXPOSE 7000 7001 7199 9042 9160
153+
CMD ["cassandra", "-f"]

4.0/docker-entrypoint.sh

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#!/bin/bash
2+
set -e
3+
4+
# first arg is `-f` or `--some-option`
5+
# or there are no args
6+
if [ "$#" -eq 0 ] || [ "${1#-}" != "$1" ]; then
7+
set -- cassandra -f "$@"
8+
fi
9+
10+
# allow the container to be started with `--user`
11+
if [ "$1" = 'cassandra' -a "$(id -u)" = '0' ]; then
12+
find "$CASSANDRA_CONF" /var/lib/cassandra /var/log/cassandra \
13+
\! -user cassandra -exec chown cassandra '{}' +
14+
exec gosu cassandra "$BASH_SOURCE" "$@"
15+
fi
16+
17+
_ip_address() {
18+
# scrape the first non-localhost IP address of the container
19+
# in Swarm Mode, we often get two IPs -- the container IP, and the (shared) VIP, and the container IP should always be first
20+
ip address | awk '
21+
$1 == "inet" && $NF != "lo" {
22+
gsub(/\/.+$/, "", $2)
23+
print $2
24+
exit
25+
}
26+
'
27+
}
28+
29+
# "sed -i", but without "mv" (which doesn't work on a bind-mounted file, for example)
30+
_sed-in-place() {
31+
local filename="$1"; shift
32+
local tempFile
33+
tempFile="$(mktemp)"
34+
sed "$@" "$filename" > "$tempFile"
35+
cat "$tempFile" > "$filename"
36+
rm "$tempFile"
37+
}
38+
39+
if [ "$1" = 'cassandra' ]; then
40+
: ${CASSANDRA_RPC_ADDRESS='0.0.0.0'}
41+
42+
: ${CASSANDRA_LISTEN_ADDRESS='auto'}
43+
if [ "$CASSANDRA_LISTEN_ADDRESS" = 'auto' ]; then
44+
CASSANDRA_LISTEN_ADDRESS="$(_ip_address)"
45+
fi
46+
47+
: ${CASSANDRA_BROADCAST_ADDRESS="$CASSANDRA_LISTEN_ADDRESS"}
48+
49+
if [ "$CASSANDRA_BROADCAST_ADDRESS" = 'auto' ]; then
50+
CASSANDRA_BROADCAST_ADDRESS="$(_ip_address)"
51+
fi
52+
: ${CASSANDRA_BROADCAST_RPC_ADDRESS:=$CASSANDRA_BROADCAST_ADDRESS}
53+
54+
if [ -n "${CASSANDRA_NAME:+1}" ]; then
55+
: ${CASSANDRA_SEEDS:="cassandra"}
56+
fi
57+
: ${CASSANDRA_SEEDS:="$CASSANDRA_BROADCAST_ADDRESS"}
58+
59+
_sed-in-place "$CASSANDRA_CONF/cassandra.yaml" \
60+
-r 's/(- seeds:).*/\1 "'"$CASSANDRA_SEEDS"'"/'
61+
62+
for yaml in \
63+
broadcast_address \
64+
broadcast_rpc_address \
65+
cluster_name \
66+
endpoint_snitch \
67+
listen_address \
68+
num_tokens \
69+
rpc_address \
70+
start_rpc \
71+
; do
72+
var="CASSANDRA_${yaml^^}"
73+
val="${!var}"
74+
if [ "$val" ]; then
75+
_sed-in-place "$CASSANDRA_CONF/cassandra.yaml" \
76+
-r 's/^(# )?('"$yaml"':).*/\2 '"$val"'/'
77+
fi
78+
done
79+
80+
for rackdc in dc rack; do
81+
var="CASSANDRA_${rackdc^^}"
82+
val="${!var}"
83+
if [ "$val" ]; then
84+
_sed-in-place "$CASSANDRA_CONF/cassandra-rackdc.properties" \
85+
-r 's/^('"$rackdc"'=).*/\1 '"$val"'/'
86+
fi
87+
done
88+
fi
89+
90+
exec "$@"

update.sh

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ set -Eeuo pipefail
33

44
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
55

6-
# TODO update to 11 for 4.0 (https://issues.apache.org/jira/browse/CASSANDRA-9608)
7-
defaultJavaVersion='8'
6+
defaultJavaVersion='11'
87
declare -A javaVersions=(
9-
#[2.2]='8'
8+
[2.1]='8'
9+
[2.2]='8'
10+
[3.0]='8'
11+
[3.11]='8'
1012
)
1113

1214
versions=( "$@" )

0 commit comments

Comments
 (0)