WIP Docker building

This commit is contained in:
2026-07-19 23:17:51 +02:00
parent fafb076f2b
commit 5e154cf654
5 changed files with 127 additions and 70 deletions
+65 -17
View File
@@ -3,16 +3,18 @@ import docker
from .version import BlenderVersion
from pathlib import Path
from docker.errors import BuildError
from docker.errors import BuildError, APIError, ContainerError, ImageNotFound
class BlenderDocker:
def __init__(self, blender: BlenderVersion):
self._blender_version = blender
# Todo get a user config
# self._docker_client = docker.DockerClient(base_url=f'unix://{Path.home()}/.docker/desktop/docker.sock')
self._docker_client = docker.DockerClient(base_url=f'unix:///var/run/docker.sock')
self.login()
self._docker_image = None
self._repository = 'stilobique/blender'
self._docker_image_name = self._blender_version.format_to_tag(self._repository)
self._docker_file = Path(os.getcwd(), 'Dockerfile')
if not self._docker_file.exists():
@@ -23,21 +25,36 @@ class BlenderDocker:
'b3d_vs_major': f'{self._blender_version.major}',
'b3d_vs_minor': f'{self._blender_version.minor}.{self._blender_version.hotfix}',
}
def login(self):
try:
print('Login to Hub Docker.')
self._docker_client.login(
username=os.environ['DOCKER_HUB_USER'],
password=os.environ['DOCKER_HUB_PASSWORD']
)
except APIError as e:
print(f'Login failed with error: {e}')
exit(1)
def build(self):
try:
print('\tBuilding Blender Docker')
print(f'\tWhere to build: {os.getcwd()}')
print(f'\tArgs: {self.args}')
print(f'\tTage generated: {self._blender_version.format_to_tag()}')
build = self._docker_client.images.build(
path=os.getcwd(),
buildargs=self.args,
tag=self._blender_version.format_to_tag(),
quiet=False,
print(f'\tTag: {self._docker_image_name}')
self._docker_image = self._docker_client.images.build(
path=os.getcwd(),
# nocache=True,
buildargs=self.args,
tag=self._docker_image_name,
quiet=True,
rm=True,
forcerm=True
)
print(f'\tBuilding Blender Docker Image done: {build}')
return build
print(f'\tBuilding Blender Docker Image done: {self._docker_image}')
except BuildError as e:
print("Hey something went wrong with image build!")
@@ -51,13 +68,44 @@ class BlenderDocker:
print('\tSet Tags version and/or Latest')
pass
@staticmethod
def test(self):
print('\tTesting Blender Docker')
# docker run --rm stilobique/blender:5.1.2 ./blender --version
pass
try:
print('\tTesting your Blender Docker image')
print(f'\tLoad: {self._docker_image_name}')
test = self._docker_client.containers.run(
name=f"Blender-Docker-Testing-{self._blender_version.tag_name_slugify()}",
image=self._docker_image_name,
command=['./blender', '--version'],
auto_remove = True,
remove=True,
detach=True,
stdout=True
)
print(f'\tResult: {test.logs()}')
return True
except ContainerError as e:
print(f'Container error: {e}')
exit(1)
except ImageNotFound as e:
print(f'Image not found: {e}')
exit(1)
except APIError as e:
print(f'API error: {e}')
for line in e.build_log:
if 'stream' in line:
print(line['stream'].strip())
exit(1)
def push(self):
# TODO Login to hub
pass
self._docker_client.images.push(
repository=self._repository,
tag=self._blender_version.tag_name(),
stream=True,
)
+8 -1
View File
@@ -18,9 +18,16 @@ class BlenderVersion:
self.minor = version[1]
self.hotfix = version[2]
def format_to_tag(self) -> str:
def format_to_tag(self, repository: str) -> str:
"""From version information, format to return a string"""
return f'{repository}:{self.major}.{self.minor}.{self.hotfix}'
def tag_name(self) -> str:
"""Return the tag name 'latest', 'X.Y.Z'..."""
return f'{self.major}.{self.minor}.{self.hotfix}'
def tag_name_slugify(self):
return f'{self.major}-{self.minor}-{self.hotfix}'
def __str__(self):
return str(self.major + '.' + self.minor + '.' + self.hotfix)