bentoctl
bentoctl copied to clipboard
fix: prevent deleting temp directory before docker build process
Description
Tried to run Google Cloud Run deployment example and encountered problem with non existing temp directory during bentoctl build
command execution. It turned out that when function _prepare_bento_dir
returns path to temporary directory it was already removed from FS. I added ugly workaround to make it work.
Logs:
$ poetry run bentoctl build -b sklearn-pipeline-service:latest -f deployment_config.yaml
Traceback (most recent call last):
File "/home/user/praca/zenml_template/.venv/bin/bentoctl", line 8, in <module>
sys.exit(bentoctl())
File "/home/user/praca/zenml_template/.venv/lib/python3.10/site-packages/click/core.py", line 1130, in __call__
return self.main(*args, **kwargs)
File "/home/user/praca/zenml_template/.venv/lib/python3.10/site-packages/click/core.py", line 1055, in main
rv = self.invoke(ctx)
File "/home/user/praca/zenml_template/.venv/lib/python3.10/site-packages/click/core.py", line 1657, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/user/praca/zenml_template/.venv/lib/python3.10/site-packages/click/core.py", line 1404, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/user/praca/zenml_template/.venv/lib/python3.10/site-packages/click/core.py", line 760, in invoke
return __callback(*args, **kwargs)
File "/home/user/praca/zenml_template/.venv/lib/python3.10/site-packages/bentoctl/cli/utils.py", line 92, in wrapper
return_value = func(*args, **kwargs)
File "/home/user/praca/zenml_template/.venv/lib/python3.10/site-packages/bentoctl/cli/utils.py", line 57, in wrapper
return func(*args, **kwargs)
File "/home/user/praca/zenml_template/.venv/lib/python3.10/site-packages/bentoctl/cli/utils.py", line 26, in wrapper
return func(*args, **kwargs)
File "/home/user/praca/zenml_template/.venv/lib/python3.10/site-packages/bentoctl/cli/__init__.py", line 316, in build
generate_deployable_container(
File "/home/user/praca/zenml_template/.venv/lib/python3.10/site-packages/bentoctl/docker_utils.py", line 120, in generate_deployable_container
backend.build(**buildx_args)
File "/home/user/praca/zenml_template/.venv/lib/python3.10/site-packages/bentoml/_internal/container/base.py", line 186, in build
return subprocess.check_output(commands, cwd=context_path, env=env)
File "/usr/lib/python3.10/subprocess.py", line 421, in check_output
return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
File "/usr/lib/python3.10/subprocess.py", line 503, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.10/subprocess.py", line 971, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "/usr/lib/python3.10/subprocess.py", line 1863, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/tmpmaualbd1fsTempFS/'
After code changes:
$ poetry run bentoctl build -b sklearn-pipeline-service:latest -f deployment_config.yaml
[+] Building 7.1s (16/16) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.61kB 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.10-slim 1.7s
=> [ 1/11] FROM docker.io/library/python:3.10-slim@sha256:ef44c53813f71871130462fcd1cf77df9a3a468ed7730b402e1216e21ed8fe4f 0.0s
=> => resolve docker.io/library/python:3.10-slim@sha256:ef44c53813f71871130462fcd1cf77df9a3a468ed7730b402e1216e21ed8fe4f 0.0s
=> [internal] load build context 1.8s
=> => transferring context: 520.29MB 1.8s
=> CACHED [ 2/11] RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache 0.0s
=> CACHED [ 3/11] RUN set -eux && apt-get update -y && apt-get install -q -y --no-install-recommends --allow-remove-essential ca-certificates gnupg2 bash bu 0.0s
=> CACHED [ 4/11] RUN groupadd -g 1034 -o bentoml && useradd -m -u 1034 -g 1034 -o -r bentoml 0.0s
=> CACHED [ 5/11] RUN mkdir /home/bentoml/bento && chown bentoml:bentoml /home/bentoml/bento -R 0.0s
=> CACHED [ 6/11] WORKDIR /home/bentoml/bento 0.0s
=> CACHED [ 7/11] COPY --chown=bentoml:bentoml ./env/python ./env/python/ 0.0s
=> CACHED [ 8/11] RUN bash -euxo pipefail /home/bentoml/bento/env/python/install.sh 0.0s
=> [ 9/11] COPY --chown=bentoml:bentoml . ./ 1.5s
=> [10/11] RUN rm -rf /var/lib/{apt,cache,log} 0.2s
=> [11/11] RUN chmod +x /home/bentoml/bento/env/docker/entrypoint.sh 0.3s
=> exporting to image 1.5s
=> => exporting layers 1.5s
=> => writing image sha256:7a8f80f104878d93fbdd31a20b637a6fa6422427a1324881d68351fad18af033 0.0s
=> => naming to docker.io/library/google-cloud-run-sklearn-pipeline-service:qu6wo3gb2wzj3x5u 0.0s
Created the repository quickstart
The push refers to repository [gcr.io/adam-wawrzynski-sandbox/quickstart]
qu6wo3gb2wzj3x5u: digest: sha256:46ade0540d140841a73a82d21e037933ad3d638ec60608a73635b8f6beec5713 size: 3460
490d74d4384b: Pushed
78c36977bcad: Pushed
e9511ab5cf18: Pushed
2239b03e600a: Layer already exists
32e4bb8936e1: Layer already exists
5f70bf18a086: Layer already exists
68cfdfec1fb2: Layer already exists
9a2cb7e03151: Layer already exists
855b762a5205: Layer already exists
0b840933af6e: Layer already exists
d3a090682432: Layer already exists
c6d948842d1e: Layer already exists
760fe20c9771: Layer already exists
da5d55102092: Layer already exists
fb1bd2fc5282: Layer already exists
🚀 Image pushed!
✨ generated template files.
- ./bentoctl.tfvars
bentoctl has built and pushed the bento and generated the terraform files 🎉
Now follow the steps below to use terraform to carry out the deployment
1. Initialise the terraform working directory.
$ terraform init
2. Run terraform plan to see the changes that will take place
$ terraform plan -var-file bentoctl.tfvars
3. Apply the changes to create the actual infrastructure
$ terraform apply -var-file bentoctl.tfvars
To cleanup all the resources and delete the repositories created run
$ bentoctl destroy
---
There is also an experimental command that you can use.
To create the resources specifed run this after the build command.
$ bentoctl apply
To cleanup all the resources created and delete the registry run
$ bentoctl destroy