Skip to content

Commit

Permalink
[ci] Support docker build args in buildImage steps (#13612)
Browse files Browse the repository at this point in the history
Curious for your thoughts on this. I think this will make it easier to
build `hailgenetics/hail` images for different python versions without
duplicating Dockerfiles with the nice side-effect of not needing to
jinja our Dockerfiles.
  • Loading branch information
daniel-goldstein authored Sep 16, 2023
1 parent d0c8ef5 commit 96e5ae4
Show file tree
Hide file tree
Showing 28 changed files with 141 additions and 60 deletions.
36 changes: 18 additions & 18 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -142,21 +142,21 @@ $(HAILTOP_VERSION):

hail-ubuntu-image: $(shell git ls-files docker/hail-ubuntu)
$(eval HAIL_UBUNTU_IMAGE := $(DOCKER_PREFIX)/hail-ubuntu:$(TOKEN))
python3 ci/jinja2_render.py '{"global":{"docker_prefix":"$(DOCKER_PREFIX)"}}' docker/hail-ubuntu/Dockerfile docker/hail-ubuntu/Dockerfile.out
./docker-build.sh docker/hail-ubuntu Dockerfile.out $(HAIL_UBUNTU_IMAGE)
DOCKER_BUILD_ARGS='--build-arg DOCKER_PREFIX=$(DOCKER_PREFIX)' \
./docker-build.sh docker/hail-ubuntu Dockerfile $(HAIL_UBUNTU_IMAGE)
echo $(HAIL_UBUNTU_IMAGE) > $@

base-image: hail-ubuntu-image docker/Dockerfile.base
$(eval BASE_IMAGE := $(DOCKER_PREFIX)/base:$(TOKEN))
python3 ci/jinja2_render.py '{"hail_ubuntu_image":{"image":"'$$(cat hail-ubuntu-image)'"}}' docker/Dockerfile.base docker/Dockerfile.base.out
./docker-build.sh . docker/Dockerfile.base.out $(BASE_IMAGE)
DOCKER_BUILD_ARGS='--build-arg BASE_IMAGE='$$(cat hail-ubuntu-image) \
./docker-build.sh . docker/Dockerfile.base $(BASE_IMAGE)
echo $(BASE_IMAGE) > $@

hail-run-image: base-image hail/Dockerfile.hail-run hail/python/pinned-requirements.txt hail/python/dev/pinned-requirements.txt docker/core-site.xml
$(eval BASE_IMAGE := $(DOCKER_PREFIX)/hail-run:$(TOKEN))
$(MAKE) -C hail wheel
python3 ci/jinja2_render.py '{"base_image":{"image":"'$$(cat base-image)'"}}' hail/Dockerfile.hail-run hail/Dockerfile.hail-run.out
./docker-build.sh . hail/Dockerfile.hail-run.out $(BASE_IMAGE)
DOCKER_BUILD_ARGS='--build-arg BASE_IMAGE='$$(cat base-image) \
./docker-build.sh . hail/Dockerfile.hail-run $(BASE_IMAGE)
echo $(BASE_IMAGE) > $@

private-repo-hailgenetics-hail-image: hail-ubuntu-image docker/hailgenetics/hail/Dockerfile $(shell git ls-files hail/src/main hail/python)
Expand All @@ -165,8 +165,8 @@ private-repo-hailgenetics-hail-image: hail-ubuntu-image docker/hailgenetics/hail
tar -cvf wheel-container.tar \
-C hail/build/deploy/dist \
hail-$$(cat hail/python/hail/hail_pip_version)-py3-none-any.whl
python3 ci/jinja2_render.py '{"hail_ubuntu_image":{"image":"'$$(cat hail-ubuntu-image)'"}}' docker/hailgenetics/hail/Dockerfile docker/hailgenetics/hail/Dockerfile.out
./docker-build.sh . docker/hailgenetics/hail/Dockerfile.out $(PRIVATE_REPO_HAILGENETICS_HAIL_IMAGE)
DOCKER_BUILD_ARGS='--build-arg BASE_IMAGE='$$(cat hail-ubuntu-image) \
./docker-build.sh . docker/hailgenetics/hail/Dockerfile $(PRIVATE_REPO_HAILGENETICS_HAIL_IMAGE)
rm wheel-container.tar
echo $(PRIVATE_REPO_HAILGENETICS_HAIL_IMAGE) > $@

Expand All @@ -183,20 +183,20 @@ website-image: docs

$(SERVICES_IMAGES): %-image: $(SERVICES_IMAGE_DEPS) $(shell git ls-files $$*)
$(eval IMAGE := $(DOCKER_PREFIX)/$*:$(TOKEN))
python3 ci/jinja2_render.py '{"hail_ubuntu_image":{"image":"'$$(cat hail-ubuntu-image)'"}}' $*/Dockerfile $*/Dockerfile.out
./docker-build.sh . $*/Dockerfile.out $(IMAGE)
DOCKER_BUILD_ARGS='--build-arg BASE_IMAGE='$$(cat hail-ubuntu-image) \
./docker-build.sh . $*/Dockerfile $(IMAGE)
echo $(IMAGE) > $@

ci-utils-image: base-image $(SERVICES_IMAGE_DEPS) $(shell git ls-files ci)
$(eval CI_UTILS_IMAGE := $(DOCKER_PREFIX)/ci-utils:$(TOKEN))
python3 ci/jinja2_render.py '{"base_image":{"image":"'$$(cat base-image)'"}}' ci/Dockerfile.ci-utils ci/Dockerfile.ci-utils.out
./docker-build.sh . ci/Dockerfile.ci-utils.out $(CI_UTILS_IMAGE)
DOCKER_BUILD_ARGS='--build-arg BASE_IMAGE='$$(cat base-image) \
./docker-build.sh . ci/Dockerfile.ci-utils $(CI_UTILS_IMAGE)
echo $(CI_UTILS_IMAGE) > $@

hail-buildkit-image: ci/buildkit/Dockerfile
$(eval HAIL_BUILDKIT_IMAGE := $(DOCKER_PREFIX)/hail-buildkit:$(TOKEN))
python3 ci/jinja2_render.py '{"global":{"docker_prefix":"$(DOCKER_PREFIX)"}}' ci/buildkit/Dockerfile ci/buildkit/Dockerfile.out
./docker-build.sh ci buildkit/Dockerfile.out $(HAIL_BUILDKIT_IMAGE)
DOCKER_BUILD_ARGS='--build-arg DOCKER_PREFIX=$(DOCKER_PREFIX)' \
./docker-build.sh ci buildkit/Dockerfile $(HAIL_BUILDKIT_IMAGE)
echo $(HAIL_BUILDKIT_IMAGE) > $@

batch/jvm-entryway/build/libs/jvm-entryway.jar: $(shell git ls-files batch/jvm-entryway)
Expand All @@ -210,12 +210,12 @@ batch-worker-image: batch/jvm-entryway/build/libs/jvm-entryway.jar $(SERVICES_IM

vep-grch37-image: hail-ubuntu-image
$(eval VEP_GRCH37_IMAGE := $(DOCKER_PREFIX)/hailgenetics/vep-grch37-85:$(TOKEN))
python3 ci/jinja2_render.py '{"hail_ubuntu_image":{"image":"'$$(cat hail-ubuntu-image)'"}}' vep/grch37/85/Dockerfile vep/grch37/85/Dockerfile.out
./docker-build.sh docker/vep/grch37/85/Dockerfile.out $(VEP_GRCH37_IMAGE)
DOCKER_BUILD_ARGS='--build-arg BASE_IMAGE='$$(cat hail-ubuntu-image) \
./docker-build.sh docker/vep docker/vep/grch37/85/Dockerfile $(VEP_GRCH37_IMAGE)
echo $(VEP_GRCH37_IMAGE) > $@

vep-grch38-image: hail-ubuntu-image
$(eval VEP_GRCH38_IMAGE := $(DOCKER_PREFIX)/hailgenetics/vep-grch38-95:$(TOKEN))
python3 ci/jinja2_render.py '{"hail_ubuntu_image":{"image":"'$$(cat hail-ubuntu-image)'"}}' vep/grch38/95/Dockerfile vep/grch38/95/Dockerfile.out
./docker-build.sh docker/vep/grch38/95/Dockerfile.out $(VEP_GRCH38_IMAGE)
DOCKER_BUILD_ARGS='--build-arg BASE_IMAGE='$$(cat hail-ubuntu-image) \
./docker-build.sh docker/vep docker/vep/grch38/95/Dockerfile $(VEP_GRCH38_IMAGE)
echo $(VEP_GRCH38_IMAGE) > $@
3 changes: 2 additions & 1 deletion admin-pod/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM {{ hail_ubuntu_image.image }}
ARG BASE_IMAGE={{ hail_ubuntu_image.image }}
FROM $BASE_IMAGE

# https://bugs.mysql.com/bug.php?id=105288&thanks=sub
RUN hail-apt-get-install xz-utils libncurses5 && \
Expand Down
3 changes: 2 additions & 1 deletion auth/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM {{ hail_ubuntu_image.image }}
ARG BASE_IMAGE={{ hail_ubuntu_image.image }}
FROM $BASE_IMAGE

COPY hail/python/hailtop/pinned-requirements.txt hailtop-requirements.txt
COPY gear/pinned-requirements.txt gear-requirements.txt
Expand Down
3 changes: 2 additions & 1 deletion batch/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM {{ hail_ubuntu_image.image }}
ARG BASE_IMAGE={{ hail_ubuntu_image.image }}
FROM $BASE_IMAGE

COPY hail/python/hailtop/pinned-requirements.txt hailtop-requirements.txt
COPY gear/pinned-requirements.txt gear-requirements.txt
Expand Down
3 changes: 2 additions & 1 deletion batch/Dockerfile.worker
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM {{ hail_ubuntu_image.image }} AS base
ARG BASE_IMAGE={{ hail_ubuntu_image.image }}
FROM $BASE_IMAGE AS base

# libyajl-dev: crun runtime dependency
RUN hail-apt-get-install \
Expand Down
3 changes: 2 additions & 1 deletion blog/Dockerfile.nginx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM {{ hail_ubuntu_image.image }}
ARG BASE_IMAGE={{ hail_ubuntu_image.image }}
FROM $BASE_IMAGE

RUN hail-apt-get-install nginx

Expand Down
3 changes: 2 additions & 1 deletion bootstrap-gateway/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM {{ hail_ubuntu_image.image }}
ARG BASE_IMAGE={{ hail_ubuntu_image.image }}
FROM $BASE_IMAGE

RUN hail-apt-get-install nginx

Expand Down
18 changes: 12 additions & 6 deletions build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ steps:
memory: standard
dockerFile:
inline: |
FROM {{ global.docker_root_image }}
ARG BASE_IMAGE={{ global.docker_root_image }}
FROM $BASE_IMAGE
RUN apt-get update && apt-get install -y git make bash
- kind: runImage
name: merge_code
Expand Down Expand Up @@ -1357,7 +1358,8 @@ steps:
contextPath: /io/repo
dockerFile:
inline: |
FROM {{ hail_ubuntu_image.image }}
ARG BASE_IMAGE={{ hail_ubuntu_image.image }}
FROM $BASE_IMAGE
RUN hail-apt-get-install make
COPY hail/python/pinned-requirements.txt hail-requirements.txt
COPY hail/python/dev/pinned-requirements.txt dev-requirements.txt
Expand Down Expand Up @@ -2482,7 +2484,8 @@ steps:
publishAs: netcat
dockerFile:
inline: |
FROM {{ hail_ubuntu_image.image }}
ARG BASE_IMAGE={{ hail_ubuntu_image.image }}
FROM $BASE_IMAGE
RUN hail-apt-get-install netcat
dependsOn:
- hail_ubuntu_image
Expand All @@ -2491,7 +2494,8 @@ steps:
publishAs: volume
dockerFile:
inline: |
FROM {{ hail_ubuntu_image.image }}
ARG BASE_IMAGE={{ hail_ubuntu_image.image }}
FROM $BASE_IMAGE
VOLUME ["/data"]
WORKDIR "/tmp"
VOLUME ["relative_volume"]
Expand All @@ -2502,7 +2506,8 @@ steps:
publishAs: workdir
dockerFile:
inline: |
FROM {{ hail_ubuntu_image.image }}
ARG BASE_IMAGE={{ hail_ubuntu_image.image }}
FROM $BASE_IMAGE
WORKDIR ["/work"]
dependsOn:
- hail_ubuntu_image
Expand All @@ -2511,7 +2516,8 @@ steps:
publishAs: curl
dockerFile:
inline: |
FROM {{ hail_ubuntu_image.image }}
ARG BASE_IMAGE={{ hail_ubuntu_image.image }}
FROM $BASE_IMAGE
RUN hail-apt-get-install curl
dependsOn:
- hail_ubuntu_image
Expand Down
3 changes: 2 additions & 1 deletion ci/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM {{ hail_ubuntu_image.image }}
ARG BASE_IMAGE={{ hail_ubuntu_image.image }}
FROM $BASE_IMAGE

RUN hail-apt-get-install git

Expand Down
3 changes: 2 additions & 1 deletion ci/Dockerfile.ci-utils
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM {{ base_image.image }} AS base
ARG BASE_IMAGE={{ base_image.image }}
FROM $BASE_IMAGE AS base

# source: https://cloud.google.com/storage/docs/gsutil_install#linux
RUN curl --remote-name https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-421.0.0-linux-x86_64.tar.gz && \
Expand Down
3 changes: 2 additions & 1 deletion ci/buildkit/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM {{ global.docker_prefix }}/moby/buildkit:v0.8.3-rootless
ARG DOCKER_PREFIX={{ global.docker_prefix }}
FROM $DOCKER_PREFIX/moby/buildkit:v0.8.3-rootless
USER root
RUN apk add python3 py-pip jq && pip3 install jinja2
USER user
Expand Down
40 changes: 29 additions & 11 deletions ci/ci/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class ServiceAccount(TypedDict):
namespace: str


def expand_value_from(value, config):
def expand_value_from(value, config) -> str:
if isinstance(value, str):
return value

Expand Down Expand Up @@ -278,14 +278,26 @@ def cleanup(self, batch, scope, parents):

class BuildImage2Step(Step):
def __init__(
self, params: StepParameters, dockerfile, context_path, publish_as, inputs, resources
self,
params: StepParameters,
dockerfile,
context_path,
publish_as,
inputs,
resources,
build_args,
): # pylint: disable=unused-argument
super().__init__(params)
self.dockerfile = dockerfile
self.context_path = context_path
self.inputs = inputs
self.resources = resources

self.build_args = {
arg['name']: expand_value_from(arg['value'], self.input_config(params.code, params.scope))
for arg in build_args
}

image_name = publish_as
self.base_image = f'{DOCKER_PREFIX}/{image_name}'
self.main_branch_cache_repository = f'{self.base_image}:cache'
Expand Down Expand Up @@ -326,6 +338,7 @@ def from_json(params: StepParameters):
json['publishAs'],
json.get('inputs'),
json.get('resources'),
json.get('buildArgs', []),
)

def config(self, scope): # pylint: disable=unused-argument
Expand All @@ -345,6 +358,10 @@ def build(self, batch, code, scope):
if not context:
context = '/io'

build_args_str = ' \\\n'.join(
f'--opt build-arg:{shq(name)}={shq(value)}' for name, value in self.build_args.items()
)

if isinstance(self.dockerfile, dict):
assert ['inline'] == list(self.dockerfile.keys())
unrendered_dockerfile = f'/home/user/Dockerfile.in.{self.token}'
Expand Down Expand Up @@ -373,15 +390,16 @@ def build(self, batch, code, scope):
export BUILDKITD_FLAGS='--oci-worker-no-process-sandbox --oci-worker-snapshotter=overlayfs'
export BUILDCTL_CONNECT_RETRIES_MAX=100 # https://github.com/moby/buildkit/issues/1423
retry buildctl-daemonless.sh \
build \
--frontend dockerfile.v0 \
--local context={shq(context)} \
--local dockerfile=/home/user \
--output 'type=image,"name={shq(self.image)},{shq(self.cache_repository)}",push=true' \
--export-cache type=inline \
--import-cache type=registry,ref={shq(self.cache_repository)} \
--import-cache type=registry,ref={shq(self.main_branch_cache_repository)} \
retry buildctl-daemonless.sh \\
build \\
--frontend dockerfile.v0 \\
--local context={shq(context)} \\
--local dockerfile=/home/user \\
--output 'type=image,"name={shq(self.image)},{shq(self.cache_repository)}",push=true' \\
--export-cache type=inline \\
--import-cache type=registry,ref={shq(self.cache_repository)} \\
--import-cache type=registry,ref={shq(self.main_branch_cache_repository)} \\
{build_args_str} \\
--trace=/home/user/trace
cat /home/user/trace
'''
Expand Down
3 changes: 2 additions & 1 deletion ci/test/resources/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM {{ ci_utils_image.image }}
ARG BASE_IMAGE={{ ci_utils_image.image }}
FROM $BASE_IMAGE

COPY ci/test/resources/hello.py /hello/

Expand Down
31 changes: 30 additions & 1 deletion ci/test/resources/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,15 @@ steps:
optional: true
- kind: buildImage2
name: git_make_bash_image
buildArgs:
- name: BASE_IMAGE
value:
valueFrom: global.docker_root_image
publishAs: git-make-bash
dockerFile:
inline: |
FROM {{ global.docker_root_image }}
ARG BASE_IMAGE
FROM $BASE_IMAGE
RUN apt-get update && apt-get install -y git make bash
- kind: runImage
name: merge_code
Expand Down Expand Up @@ -46,6 +51,30 @@ steps:
to: /io/hail-ubuntu
dependsOn:
- merge_code
- kind: buildImage2
name: hail_ubuntu_image_python_3_10
dockerFile: /io/hail-ubuntu/Dockerfile
contextPath: /io/hail-ubuntu
buildArgs:
- name: PYTHON_VERSION
value: "3.10"
- name: DOCKER_PREFIX
value:
valueFrom: global.docker_prefix
publishAs: hail-ubuntu-py-3-10
inputs:
- from: /repo/docker/hail-ubuntu
to: /io/hail-ubuntu
dependsOn:
- merge_code
- kind: runImage
name: test_build_image_build_args_override_default
image:
valueFrom: hail_ubuntu_image_python_3_10.image
script: |
python3 --version | grep '3.10'
dependsOn:
- hail_ubuntu_image_python_3_10
- kind: buildImage2
name: base_image
dockerFile: /io/repo/docker/Dockerfile.base
Expand Down
1 change: 1 addition & 0 deletions docker-build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ DOCKER_BUILDKIT=1 docker build \
${DEV_CACHE:+--cache-from ${DEV_CACHE}} \
${EXTRA_CACHE:+--cache-from ${EXTRA_CACHE}} \
--build-arg BUILDKIT_INLINE_CACHE=1 \
${DOCKER_BUILD_ARGS} \
--tag ${REMOTE_IMAGE_NAME} \
--tag ${CACHE_IMAGE_NAME} \
${CONTEXT}
Expand Down
3 changes: 2 additions & 1 deletion docker/Dockerfile.base
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM {{ hail_ubuntu_image.image }}
ARG BASE_IMAGE={{ hail_ubuntu_image.image }}
FROM $BASE_IMAGE

RUN hail-apt-get-install \
git \
Expand Down
3 changes: 2 additions & 1 deletion docker/Dockerfile.hail-dev
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM {{ hailgenetics_hail_image.image }}
ARG HAIL_IMAGE={{ hailgenetics_hail_image.image }}
FROM $HAIL_IMAGE

COPY hail/python/dev/pinned-requirements.txt dev-requirements.txt
RUN hail-pip-install -r dev-requirements.txt
11 changes: 8 additions & 3 deletions docker/hail-ubuntu/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
FROM {{ global.docker_prefix }}/ubuntu:jammy-20230624
ARG DOCKER_PREFIX={{ global.docker_prefix }}
FROM $DOCKER_PREFIX/ubuntu:jammy-20230624

ENV LANG C.UTF-8
ENV DEBIAN_FRONTEND noninteractive

COPY retry /bin/retry
COPY hail-apt-get-install /bin/hail-apt-get-install
COPY pip.conf /root/.config/pip/pip.conf
COPY hail-pip-install /bin/hail-pip-install
COPY controller.sh /
COPY curlrc /root/.curlrc

ARG PYTHON_VERSION=3.9
RUN chmod 755 /bin/retry && \
chmod 755 /bin/hail-apt-get-install && \
chmod 755 /bin/hail-pip-install && \
Expand All @@ -20,8 +25,8 @@ RUN chmod 755 /bin/retry && \
>> /etc/apt/sources.list && \
echo 'deb-src [signed-by=/usr/share/keyrings/deadsnakes-ppa-archive-keyring.gpg] http://ppa.launchpad.net/deadsnakes/ppa/ubuntu jammy main' \
>> /etc/apt/sources.list && \
hail-apt-get-install python3.9-minimal python3.9-dev python3.9-distutils gcc g++ && \
update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1 && \
hail-apt-get-install python$PYTHON_VERSION-minimal python$PYTHON_VERSION-dev python$PYTHON_VERSION-distutils gcc g++ && \
update-alternatives --install /usr/bin/python3 python3 /usr/bin/python$PYTHON_VERSION 1 && \
curl https://bootstrap.pypa.io/get-pip.py | python3 && \
python3 -m pip install 'pip>=21<22' && \
python3 -m pip check && \
Expand Down
Loading

0 comments on commit 96e5ae4

Please sign in to comment.