Skip to content

Commit de006e2

Browse files
committed
Switch from using Debian packages to using binary releases
The end result should be ~the same (the Debian packages were "Arch: all" anyways), but give us more control over the Java version (since Debian Buster doesn't even have Java 8 anymore and Cassandra doesn't support anything newer until the unreleased 4.0).
1 parent 11a1ede commit de006e2

13 files changed

+496
-556
lines changed

.travis.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,9 @@ services: docker
33

44
env:
55
- VERSION=3.11
6-
- VERSION=3.11 ARCH=i386
76
- VERSION=3.0
8-
- VERSION=3.0 ARCH=i386
97
- VERSION=2.2
10-
- VERSION=2.2 ARCH=i386
118
- VERSION=2.1
12-
- VERSION=2.1 ARCH=i386
139

1410
install:
1511
- git clone https://github.com/docker-library/official-images.git ~/official-images

2.1/Dockerfile

Lines changed: 81 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,54 @@
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

78
RUN 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
2828
RUN 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
4753
ENV 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

6461
ENV CASSANDRA_VERSION 2.1.21
62+
ENV CASSANDRA_SHA512 ea2c35f3f9ce2be8eb96df603927c6867613f3e2215132145da2c3015dd1ddf1370d7196ef4485002e7a54fe22c32abd9c659102057f9297b69113bf83d96d0b
6563

6664
RUN 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

157143
COPY docker-entrypoint.sh /usr/local/bin/
158144
RUN ln -s usr/local/bin/docker-entrypoint.sh /docker-entrypoint.sh # backwards compat
159145
ENTRYPOINT ["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

2.1/docker-entrypoint.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ fi
99

1010
# allow the container to be started with `--user`
1111
if [ "$1" = 'cassandra' -a "$(id -u)" = '0' ]; then
12-
find /var/lib/cassandra /var/log/cassandra "$CASSANDRA_CONFIG" \
12+
find "$CASSANDRA_CONF" /var/lib/cassandra /var/log/cassandra \
1313
\! -user cassandra -exec chown cassandra '{}' +
1414
exec gosu cassandra "$BASH_SOURCE" "$@"
1515
fi
@@ -56,7 +56,7 @@ if [ "$1" = 'cassandra' ]; then
5656
fi
5757
: ${CASSANDRA_SEEDS:="$CASSANDRA_BROADCAST_ADDRESS"}
5858

59-
_sed-in-place "$CASSANDRA_CONFIG/cassandra.yaml" \
59+
_sed-in-place "$CASSANDRA_CONF/cassandra.yaml" \
6060
-r 's/(- seeds:).*/\1 "'"$CASSANDRA_SEEDS"'"/'
6161

6262
for yaml in \
@@ -72,7 +72,7 @@ if [ "$1" = 'cassandra' ]; then
7272
var="CASSANDRA_${yaml^^}"
7373
val="${!var}"
7474
if [ "$val" ]; then
75-
_sed-in-place "$CASSANDRA_CONFIG/cassandra.yaml" \
75+
_sed-in-place "$CASSANDRA_CONF/cassandra.yaml" \
7676
-r 's/^(# )?('"$yaml"':).*/\2 '"$val"'/'
7777
fi
7878
done
@@ -81,7 +81,7 @@ if [ "$1" = 'cassandra' ]; then
8181
var="CASSANDRA_${rackdc^^}"
8282
val="${!var}"
8383
if [ "$val" ]; then
84-
_sed-in-place "$CASSANDRA_CONFIG/cassandra-rackdc.properties" \
84+
_sed-in-place "$CASSANDRA_CONF/cassandra-rackdc.properties" \
8585
-r 's/^('"$rackdc"'=).*/\1 '"$val"'/'
8686
fi
8787
done

0 commit comments

Comments
 (0)