| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| FROM ubuntu:20.04 |
| MAINTAINER Apache Cassandra <dev@cassandra.apache.org> |
| |
| # configure apt to retry downloads |
| RUN echo 'APT::Acquire::Retries "9";' > /etc/apt/apt.conf.d/80-retries |
| |
| # install our python dependencies and some other stuff we need |
| # libev4 libev-dev are for the python driver / libssl-dev is for python3.6 |
| |
| RUN export DEBIAN_FRONTEND=noninteractive && \ |
| apt-get update && \ |
| apt-get install -y --no-install-recommends software-properties-common apt-utils vim |
| |
| RUN export DEBIAN_FRONTEND=noninteractive && \ |
| add-apt-repository -y ppa:deadsnakes/ppa && \ |
| apt-get update && \ |
| apt-get install -y curl git-core python2.7 python-dev python3-pip \ |
| python3.6 python3.6-venv python3.6-dev \ |
| python3.7 python3.7-venv python3.7-dev \ |
| python3.8 python3.8-venv python3.8-dev \ |
| net-tools libev4 libev-dev wget gcc libssl-dev libxml2 libxslt1-dev |
| |
| # install python2-pip |
| RUN curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py |
| RUN python2.7 get-pip.py |
| RUN if ! [ -f /usr/bin/python2 ] ; then ln -s /usr/bin/python2.7 /usr/bin/python2 ; fi |
| |
| RUN update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 |
| RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2 |
| RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.7 3 |
| RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.8 4 |
| RUN python2.7 -m pip install --upgrade pip |
| RUN python3.6 -m pip install --upgrade pip |
| RUN python3.7 -m pip install --upgrade pip |
| RUN python3.8 -m pip install --upgrade pip |
| |
| # solves warning: "jemalloc shared library could not be preloaded to speed up memory allocations" |
| RUN export DEBIAN_FRONTEND=noninteractive && \ |
| apt-get update && \ |
| apt-get install -y --no-install-recommends libjemalloc2 |
| |
| # install dumb-init as minimal init system |
| RUN export DEBIAN_FRONTEND=noninteractive && \ |
| apt-get update && \ |
| apt-get install -y dumb-init |
| |
| # generate locales for the standard en_US.UTF8 value we use for testing |
| RUN export DEBIAN_FRONTEND=noninteractive && \ |
| apt-get update && \ |
| apt-get install -y locales && \ |
| locale-gen en_US.UTF-8 |
| |
| # as we only need the requirements.txt file from the dtest repo, let's just get it from GitHub as a raw asset |
| # so we can avoid needing to clone the entire repo just to get this file |
| ADD https://raw.githubusercontent.com/apache/cassandra-dtest/trunk/requirements.txt /opt |
| RUN chmod 0644 /opt/requirements.txt |
| |
| # now setup python via virtualenv with all of the python dependencies we need according to requirements.txt |
| RUN pip2 install virtualenv |
| RUN pip2 install --upgrade wheel |
| RUN pip3 install virtualenv |
| RUN pip3 install --upgrade wheel |
| |
| # openjdk + ant |
| RUN export DEBIAN_FRONTEND=noninteractive && \ |
| apt-get update && \ |
| apt-get install -y --no-install-recommends openjdk-8-jdk openjdk-11-jdk ant ant-optional |
| |
| # make Java 8 the default executable (we use to run all tests against Java 8) |
| RUN update-java-alternatives --set java-1.8.0-openjdk-$(dpkg --print-architecture) |
| |
| # enable legacy TLSv1 and TLSv1.1 (CASSANDRA-16848) |
| RUN find /etc -type f -name java.security -exec sed -i 's/TLSv1, TLSv1.1//' {} \; |
| RUN find /etc -type f -name java.security -exec sed -i 's/3DES_EDE_CBC$/3DES_EDE_CBC, TLSv1, TLSv1.1/' {} \; |
| |
| # setup our user -- if we don't do this docker will default to root and Cassandra will fail to start |
| # as we appear to have a check that the user isn't starting Cassandra as root |
| RUN export DEBIAN_FRONTEND=noninteractive && \ |
| apt-get install sudo && \ |
| adduser --disabled-password --gecos "" cassandra && \ |
| echo "cassandra ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/cassandra && \ |
| chmod 0440 /etc/sudoers.d/cassandra |
| |
| # fix up permissions on the cassandra home dir |
| RUN chown -R cassandra:cassandra /home/cassandra |
| |
| # switch to the cassandra user... we are all done running things as root |
| USER cassandra |
| ENV HOME /home/cassandra |
| WORKDIR /home/cassandra |
| |
| # Add environment variables for Ant and Java and add them to the PATH |
| RUN echo 'export ANT_HOME=/usr/share/ant' >> /home/cassandra/.bashrc && \ |
| echo 'export JAVA8_HOME=/usr/lib/jvm/java-8-openjdk-$(dpkg --print-architecture)' >> /home/cassandra/.bashrc && \ |
| echo 'export JAVA11_HOME=/usr/lib/jvm/java-11-openjdk-$(dpkg --print-architecture)' >> /home/cassandra/.bashrc && \ |
| echo 'export JAVA_HOME=$JAVA8_HOME' >> /home/cassandra/.bashrc |
| |
| ENV ANT_HOME=/usr/share/ant |
| |
| # run pip commands and setup virtualenv (note we do this after we switch to cassandra user so we |
| # setup the virtualenv for the cassandra user and not the root user by accident) for Python 3.6/3.7/3.8 |
| # Don't build cython extensions when installing cassandra-driver. During test execution the driver |
| # dependency is refreshed via pip install --upgrade, so that driver changes can be pulled in without |
| # requiring the image to be rebuilt. Rebuilding compiled extensions is costly and is disabled by |
| # default in test jobs using the CASS_DRIVER_X env vars below. However, if the extensions are |
| # included in the base image, the compiled objects are not updated by pip at run time, which can |
| # cause errors if the tests rely on new driver functionality or bug fixes. |
| RUN virtualenv --python=python2.7 env2.7 |
| RUN chmod +x env2.7/bin/activate |
| RUN /bin/bash -c "export CASS_DRIVER_NO_CYTHON=1 CASS_DRIVER_NO_EXTENSIONS=1 && source ~/env2.7/bin/activate && pip2 install --upgrade pip && pip2 install -r /opt/requirements.txt && pip2 freeze --user" |
| |
| RUN virtualenv --python=python3.6 env3.6 |
| RUN chmod +x env3.6/bin/activate |
| RUN /bin/bash -c "export CASS_DRIVER_NO_CYTHON=1 CASS_DRIVER_NO_EXTENSIONS=1 && source ~/env3.6/bin/activate && pip3 install --upgrade pip && pip3 install -r /opt/requirements.txt && pip3 freeze --user" |
| |
| RUN virtualenv --python=python3.7 env3.7 |
| RUN chmod +x env3.7/bin/activate |
| RUN /bin/bash -c "export CASS_DRIVER_NO_CYTHON=1 CASS_DRIVER_NO_EXTENSIONS=1 && source ~/env3.7/bin/activate && pip3 install --upgrade pip && pip3 install -r /opt/requirements.txt && pip3 freeze --user" |
| |
| RUN virtualenv --python=python3.8 env3.8 |
| RUN chmod +x env3.8/bin/activate |
| RUN /bin/bash -c "export CASS_DRIVER_NO_CYTHON=1 CASS_DRIVER_NO_EXTENSIONS=1 && source ~/env3.8/bin/activate && pip3 install --upgrade pip && pip3 install -r /opt/requirements.txt && pip3 freeze --user" |
| |
| # we need to make SSH less strict to prevent various dtests from failing when they attempt to |
| # git clone a given commit/tag/etc |
| # upgrading node1 to github:apache/18cdd391ec27d16daf775f928902f5a421c415e3 |
| # git@github.com:apache/cassandra.git github:apache/18cdd391ec27d16daf775f928902f5a421c415e3 |
| # 23:47:08,993 ccm INFO Cloning Cassandra... |
| # The authenticity of host 'github.com (192.30.253.112)' can't be established. |
| # RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. |
| # Are you sure you want to continue connecting (yes/no)? |
| RUN mkdir ~/.ssh |
| RUN echo 'Host *\n UserKnownHostsFile /dev/null\n StrictHostKeyChecking no' > ~/.ssh/config |
| RUN chown cassandra:cassandra ~/.ssh |
| RUN chown cassandra:cassandra ~/.ssh/config |
| RUN chmod 600 ~/.ssh/config |
| |
| # mark "/tmp" as a volume so it will get mounted as an ext4 mount and not |
| # the stupid aufs/CoW stuff that the actual docker container mounts will have. |
| # we've been seeing 3+ minute hangs when calling sync on an aufs backed mount |
| # so it greatly makes tests flaky as things can hang basically anywhere |
| VOLUME ["/tmp"] |