-
Notifications
You must be signed in to change notification settings - Fork 91
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add build-make-check-container job #1957
base: main
Are you sure you want to change the base?
Conversation
Signed-off-by: David Galloway <[email protected]>
# This is just the default. Overridden by `docker build --build-arg DISTRO=$DISTRO` at build time | ||
ARG DISTRO='ubuntu:20.04' | ||
FROM $DISTRO | ||
RUN if command -v yum; then \ | ||
yum install -y epel-release; \ | ||
yum install -y git sudo ccache clang; \ | ||
yum update -y; \ | ||
else \ | ||
apt update && DEBIAN_FRONTEND="noninteractive" apt install -y git-core sudo ccache; \ | ||
fi | ||
RUN git clone https://github.com/ceph/ceph /opt/ceph | ||
RUN git clone https://github.com/ceph/ceph-ci /opt/ceph-ci | ||
# Set some defaults (again, overridden using --build-arg) | ||
ARG INSTALL_DEPS_REPO=ceph | ||
ARG INSTALL_DEPS_BRANCH=master | ||
RUN cd /opt/$INSTALL_DEPS_REPO \ | ||
&& if ! git checkout $INSTALL_DEPS_BRANCH; then \ | ||
echo $INSTALL_DEPS_BRANCH doesn\'t exist; \ | ||
exit 1; \ | ||
fi \ | ||
&& DEBIAN_FRONTEND="noninteractive" ./install-deps.sh \ | ||
&& git submodule update --init --recursive |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would try something like that:
# This is just the default. Overridden by `docker build --build-arg DISTRO=$DISTRO` at build time | |
ARG DISTRO='ubuntu:20.04' | |
FROM $DISTRO | |
RUN if command -v yum; then \ | |
yum install -y epel-release; \ | |
yum install -y git sudo ccache clang; \ | |
yum update -y; \ | |
else \ | |
apt update && DEBIAN_FRONTEND="noninteractive" apt install -y git-core sudo ccache; \ | |
fi | |
RUN git clone https://github.com/ceph/ceph /opt/ceph | |
RUN git clone https://github.com/ceph/ceph-ci /opt/ceph-ci | |
# Set some defaults (again, overridden using --build-arg) | |
ARG INSTALL_DEPS_REPO=ceph | |
ARG INSTALL_DEPS_BRANCH=master | |
RUN cd /opt/$INSTALL_DEPS_REPO \ | |
&& if ! git checkout $INSTALL_DEPS_BRANCH; then \ | |
echo $INSTALL_DEPS_BRANCH doesn\'t exist; \ | |
exit 1; \ | |
fi \ | |
&& DEBIAN_FRONTEND="noninteractive" ./install-deps.sh \ | |
&& git submodule update --init --recursive | |
# This is just the default. Overridden by `docker build --build-arg DISTRO=$DISTRO` at build time | |
ARG DISTRO='ubuntu:20.04' | |
# Set some defaults (again, overridden using --build-arg) | |
ARG INSTALL_DEPS_REPO=ceph | |
ARG INSTALL_DEPS_BRANCH=master | |
FROM $DISTRO | |
RUN command -v yum && (yum install -y epel-release && yum install -y git sudo ccache clang && yum update -y) || (apt update && DEBIAN_FRONTEND="noninteractive" apt install -y git-core sudo ccache) && \ | |
git clone -b $INSTALL_DEPS_BRANCH --depth 1 https://github.com/ceph/ceph /opt/ceph || (echo "$INSTALL_DEPS_BRANCH doesn't exist" && exit 1) && git clone https://github.com/ceph/ceph-ci /opt/ceph-ci && \ | |
cd /opt/$INSTALL_DEPS_REPO && DEBIAN_FRONTEND="noninteractive" ./install-deps.sh && git submodule update --init --recursive |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
less steps, less layers, more readable...
just saying... 🤷♂️
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I will admit this is my first Dockerfile but I find yours to be far less readable.
Using mine, if one of the RUN steps fails, you can tell where and why right away vs. having to wait for the entire single RUN step in your suggestion. I don't want to end up with another one of these:
STEP 16/16: RUN yum install -y epel-release https://apache.jfrog.io/artifactory/arrow/centos/8/apache-arrow-release-latest.rpm && yum install -y jq && bash -c ' if [ -n "nfs-ganesha nfs-ganesha-ceph nfs-ganesha-rgw nfs-ganesha-rados-grace nfs-ganesha-rados-urls" ]; then echo "[ganesha]" > /etc/yum.repos.d/ganesha.repo ; echo "name=ganesha" >> /etc/yum.repos.d/ganesha.repo ; if [[ "${CEPH_VERSION}" == master ]]; then echo "baseurl=[https://buildlogs.centos.org/centos/\$releasever/storage/\$basearch/nfsganesha-3/](https://buildlogs.centos.org/centos//$releasever/storage//$basearch/nfsganesha-3/)" >> /etc/yum.repos.d/ganesha.repo ; echo "gpgcheck=0" >> /etc/yum.repos.d/ganesha.repo ; echo "enabled=1" >> /etc/yum.repos.d/ganesha.repo ; elif [[ "${CEPH_VERSION}" == pacific ]]; then echo "baseurl=[https://download.ceph.com/nfs-ganesha/rpm-V3.5-stable/$CEPH_VERSION/el\$releasever/\$basearch/](https://download.ceph.com/nfs-ganesha/rpm-V3.5-stable/$CEPH_VERSION/el/$releasever//$basearch/)" >> /etc/yum.repos.d/ganesha.repo ; echo "gpgcheck=1" >> /etc/yum.repos.d/ganesha.repo ; echo "enabled=1" >> /etc/yum.repos.d/ganesha.repo ; echo "[ganesha-noarch]" >> /etc/yum.repos.d/ganesha.repo ; echo "name=ganesha-noarch" >> /etc/yum.repos.d/ganesha.repo ; echo "baseurl=[https://download.ceph.com/nfs-ganesha/rpm-V3.5-stable/$CEPH_VERSION/el\$releasever/noarch/](https://download.ceph.com/nfs-ganesha/rpm-V3.5-stable/$CEPH_VERSION/el/$releasever/noarch/)" >> /etc/yum.repos.d/ganesha.repo ; echo "gpgcheck=1" >> /etc/yum.repos.d/ganesha.repo ; echo "enabled=1" >> /etc/yum.repos.d/ganesha.repo ; elif [[ "${CEPH_VERSION}" == octopus ]]; then echo "baseurl=[https://download.ceph.com/nfs-ganesha/rpm-V3.3-stable/$CEPH_VERSION/el\$releasever/\$basearch/](https://download.ceph.com/nfs-ganesha/rpm-V3.3-stable/$CEPH_VERSION/el/$releasever//$basearch/)" >> /etc/yum.repos.d/ganesha.repo ; echo "gpgcheck=1" >> /etc/yum.repos.d/ganesha.repo ; echo "enabled=1" >> /etc/yum.repos.d/ganesha.repo ; echo "[ganesha-noarch]" >> /etc/yum.repos.d/ganesha.repo ; echo "name=ganesha-noarch" >> /etc/yum.repos.d/ganesha.repo ; echo "baseurl=[https://download.ceph.com/nfs-ganesha/rpm-V3.3-stable/$CEPH_VERSION/el\$releasever/noarch/](https://download.ceph.com/nfs-ganesha/rpm-V3.3-stable/$CEPH_VERSION/el/$releasever/noarch/)" >> /etc/yum.repos.d/ganesha.repo ; echo "gpgcheck=1" >> /etc/yum.repos.d/ganesha.repo ; echo "enabled=1" >> /etc/yum.repos.d/ganesha.repo ; elif [[ "${CEPH_VERSION}" == nautilus ]]; then echo "baseurl=[https://download.ceph.com/nfs-ganesha/rpm-V2.8-stable/$CEPH_VERSION/\$basearch/](https://download.ceph.com/nfs-ganesha/rpm-V2.8-stable/$CEPH_VERSION//$basearch/)" >> /etc/yum.repos.d/ganesha.repo ; echo "gpgcheck=1" >> /etc/yum.repos.d/ganesha.repo ; echo "enabled=1" >> /etc/yum.repos.d/ganesha.repo ; else echo "baseurl=[https://download.ceph.com/nfs-ganesha/rpm-V2.7-stable/$CEPH_VERSION/\$basearch/](https://download.ceph.com/nfs-ganesha/rpm-V2.7-stable/$CEPH_VERSION//$basearch/)" >> /etc/yum.repos.d/ganesha.repo ; echo "gpgcheck=1" >> /etc/yum.repos.d/ganesha.repo ; echo "enabled=1" >> /etc/yum.repos.d/ganesha.repo ; fi ; fi ; if [ -n "tcmu-runner ceph-iscsi python3-rtslib" ]; then curl -s -L https://shaman.ceph.com/api/repos/tcmu-runner/master/latest/centos/8/repo?arch=$(arch) -o /etc/yum.repos.d/tcmu-runner.repo ; if [[ "${CEPH_VERSION}" =~ master ]]; then curl -s -L https://shaman.ceph.com/api/repos/ceph-iscsi/master/latest/centos/8/repo -o /etc/yum.repos.d/ceph-iscsi.repo ; elif [[ "${CEPH_VERSION}" =~ nautilus|octopus|pacific ]]; then curl -s -L https://download.ceph.com/ceph-iscsi/3/rpm/el8/ceph-iscsi.repo -o /etc/yum.repos.d/ceph-iscsi.repo ; else curl -s -L https://download.ceph.com/ceph-iscsi/2/rpm/el8/ceph-iscsi.repo -o /etc/yum.repos.d/ceph-iscsi.repo ; fi ; fi' && yum update -y --setopt=install_weak_deps=False && rpm --import 'https://download.ceph.com/keys/release.asc' && if [[ "${CEPH_VERSION}" == nautilus ]]; then CEPH_MGR_K8SEVENTS="ceph-mgr-k8sevents"; if [[ -n "" ]]; then CPR= ; if [[ ${CPR:1:2} -eq 14 ]] && [[ ${CPR:4:1} -eq 2 ]] && [[ ${CPR:6} -lt 5 ]]; then CEPH_MGR_K8SEVENTS="" ; fi ; fi ; fi && bash -c ' if [[ "${CEPH_VERSION}" =~ master ]] || ${CEPH_DEVEL}; then ARCH=$(arch); if [[ "${ARCH}" == "aarch64" ]]; then ARCH="arm64"; fi ; REPO_URL=$(curl -s "https://shaman.ceph.com/api/search/?project=ceph&distros=centos/8/${ARCH}&flavor=${OSD_FLAVOR}&ref=${CEPH_REF}&sha1=latest" | jq -r .[0].url); RELEASE_VER=0 ; if [[ "${OSD_FLAVOR}" == "crimson" ]]; then CRIMSON_PACKAGES="ceph-crimson-osd"; fi ; else RELEASE_VER=1 ; REPO_URL="[http://download.ceph.com/rpm-${CEPH_VERSION}/el8/](http://download.ceph.com/rpm-$%7BCEPH_VERSION%7D/el8/)"; fi && rpm -Uvh "$REPO_URL/noarch/ceph-release-1-${RELEASE_VER}.el8.noarch.rpm" && if [[ 8 -eq 8 ]]; then yum install -y dnf-plugins-core ; yum copr enable -y tchaikov/python-scikit-learn ; yum copr enable -y tchaikov/python3-asyncssh ; fi ' && yum install -y --setopt=install_weak_deps=False --enablerepo=powertools ca-certificates e2fsprogs ceph-common ceph-mon ceph-osd ceph-mds cephfs-mirror rbd-mirror ceph-mgr ceph-mgr-cephadm ceph-mgr-dashboard ceph-mgr-diskprediction-local ceph-mgr-k8sevents ceph-mgr-rook python3-saml ceph-grafana-dashboards kmod lvm2 gdisk smartmontools nvme-cli libstoragemgmt systemd-udev ceph-radosgw libradosstriper1 nfs-ganesha nfs-ganesha-ceph nfs-ganesha-rgw nfs-ganesha-rados-grace nfs-ganesha-rados-urls tcmu-runner ceph-iscsi python3-rtslib attr ceph-fuse rbd-nbd ${CRIMSON_PACKAGES} ceph-immutable-object-cache python3-scikit-learn ceph-volume && INITIAL_SIZE="$(bash -c 'sz="$(du -sm --exclude=/proc /)" ; echo "${sz%*/}"')" && echo 'Postinstall cleanup' && (rm -rf "/usr/bin/hyperkube /usr/bin/etcd /usr/bin/systemd-analyze /usr/share/hwdata/{iab.txt,oui.txt} /etc/profile.d/lang.sh" && yum clean all && rpm -q ca-certificates e2fsprogs ceph-common ceph-mon ceph-osd ceph-mds cephfs-mirror rbd-mirror ceph-mgr ceph-mgr-cephadm ceph-mgr-dashboard ceph-mgr-diskprediction-local ceph-mgr-k8sevents ceph-mgr-rook python3-saml ceph-grafana-dashboards kmod lvm2 gdisk smartmontools nvme-cli libstoragemgmt systemd-udev ceph-radosgw libradosstriper1 nfs-ganesha nfs-ganesha-ceph nfs-ganesha-rgw nfs-ganesha-rados-grace nfs-ganesha-rados-urls tcmu-runner ceph-iscsi python3-rtslib attr ceph-fuse rbd-nbd ${CRIMSON_PACKAGES} ceph-immutable-object-cache python3-scikit-learn ceph-volume ) && sed -i -e 's/udev_rules = 1/udev_rules = 0/' -e 's/udev_sync = 1/udev_sync = 0/' -e 's/obtain_device_list_from_udev = 1/obtain_device_list_from_udev = 0/' /etc/lvm/lvm.conf && grep -sqo "udev_sync = 0" /etc/lvm/lvm.conf && grep -sqo "udev_rules = 0" /etc/lvm/lvm.conf && grep -sqo "obtain_device_list_from_udev = 0" /etc/lvm/lvm.conf && rm -rf /etc/{selinux,systemd,udev} /lib/{lsb,udev} /tmp/* /usr/lib{,64}/{locale,udev,dracut} /usr/share/{doc,info,locale,man} /usr/share/{bash-completion,pkgconfig/bash-completion.pc} /var/log/* /var/tmp/* && find / -xdev -name "*.pyc" -o -name "*.pyo" -exec rm -f {} \; && if [ -f /usr/bin/ceph-dencoder ]; then gzip -9 /usr/bin/ceph-dencoder; fi && bash -c ' function ifstrip () { if compgen -g "$1"; then strip -s "$1"; fi } && ifstrip /usr/lib{,64}/ceph/erasure-code/* && ifstrip /usr/lib{,64}/rados-classes/* && ifstrip /usr/lib{,64}/python*/{dist,site}-packages/{rados,rbd,rgw}.*.so && ifstrip /usr/bin/{crushtool,monmaptool,osdmaptool}' && rm -f /usr/lib/ceph/mgr/dashboard/static/AdminLTE-*/plugins/datatables/extensions/TableTools/images/psd/* && find /var/log/ -type f -exec truncate -s 0 {} \; && FINAL_SIZE="$(bash -c 'sz="$(du -sm --exclude=/proc /)" ; echo "${sz%*/}"')" && REMOVED_SIZE=$((INITIAL_SIZE - FINAL_SIZE)) && echo "Cleaning process removed ${REMOVED_SIZE}MB" && echo "Dropped container size from ${INITIAL_SIZE}MB to ${FINAL_SIZE}MB" && rpm -q ca-certificates e2fsprogs ceph-common ceph-mon ceph-osd ceph-mds cephfs-mirror rbd-mirror ceph-mgr ceph-mgr-cephadm ceph-mgr-dashboard ceph-mgr-diskprediction-local ceph-mgr-k8sevents ceph-mgr-rook python3-saml ceph-grafana-dashboards kmod lvm2 gdisk smartmontools nvme-cli libstoragemgmt systemd-udev ceph-radosgw libradosstriper1 nfs-ganesha nfs-ganesha-ceph nfs-ganesha-rgw nfs-ganesha-rados-grace nfs-ganesha-rados-urls tcmu-runner ceph-iscsi python3-rtslib attr ceph-fuse rbd-nbd ${CRIMSON_PACKAGES} ceph-immutable-object-cache python3-scikit-learn ceph-volume && echo 'Packages verified successfully'
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Although there's not only the readability concern here, I was just suggesting, your call then... 🤷♂️
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm open to being educated 😄. What do less steps and layers mean?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Each operation (RUN, COPY, ...) adds a new layer, the more layer you have, the bigger your image size will be.
You might want to have a look at "multi-stage" builds.
https://docs.docker.com/develop/develop-images/multistage-build/
Signed-off-by: David Galloway [email protected]