Source code for contree_sdk.docker.kw_workdir
"""`WORKDIR /path` - set the working directory for subsequent directives."""
from __future__ import annotations
import posixpath
from dataclasses import dataclass
from typing import ClassVar
from .context import AsyncBuildContext, BuildContext
from .keyword import DockerKeyword
[docs]
@dataclass(frozen=True, repr=False)
class WorkdirKeyword(DockerKeyword):
NAME: ClassVar[str] = "WORKDIR"
path: str = ""
def __repr__(self) -> str:
return f"WORKDIR {self.path}"
[docs]
@classmethod
def parse(cls, args_text: str) -> WorkdirKeyword:
raw = args_text.strip()
if not raw:
raise ValueError("WORKDIR requires a path")
return cls(path=raw)
[docs]
def serialize(self) -> str:
return f"WORKDIR {self.path}"
[docs]
def execute(self, ctx: BuildContext) -> None:
target = ctx.substitute(self.path)
if posixpath.isabs(target):
ctx.workdir = posixpath.normpath(target)
else:
base = ctx.workdir or "/"
ctx.workdir = posixpath.normpath(posixpath.join(base, target))
[docs]
async def execute_async(self, ctx: AsyncBuildContext) -> None:
target = ctx.substitute(self.path)
if posixpath.isabs(target):
ctx.workdir = posixpath.normpath(target)
else:
base = ctx.workdir or "/"
ctx.workdir = posixpath.normpath(posixpath.join(base, target))