| A third target, and the seam that was already waiting for it | 1 | """Generated stub -- the container is defined by container.toml. |
| 2 | ||
| 3 | Edit container.toml, not this file. | |
| 4 | """ | |
| 5 | ||
| 6 | import os | |
| 7 | import sys | |
| 8 | ||
| 9 | sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | |
| 10 | ||
| 11 | from _loader import Container # noqa: E402 | |
| 12 | ||
| 13 | c = Container.from_toml(__file__) | |
| 14 | image, app = c.image, c.app | |
| 15 | ||
| 16 | ||
| 17 | # No @app.function here: a Sandbox runs its command as its own process and | |
| 18 | # nothing of this module is imported into it. Registering a Function would be | |
| 19 | # dead weight, and its kwargs are where vm_runtime would be wrongly applied. | |
| 20 | # One entrypoint, not two: a second `@app.local_entrypoint` makes plain | |
| 21 | # `modal run container.py` ambiguous, and Modal refuses it rather than | |
| 22 | # picking. `--shell` is a flag on the one there is. | |
| 23 | @app.local_entrypoint() | |
| 24 | def main(command: str = "", shell: bool = False): | |
| 25 | if not shell: | |
| 26 | c.run_sandbox(command) | |
| 27 | return | |
| 28 | ||
| Six verbs, and the last of the nix | 29 | # `modal shell --image` takes a registry reference and nothing else, so |
| 30 | # it cannot be pointed at the image this container actually runs -- the | |
| 31 | # one with its setup steps and its source copy in it. Attaching to a | |
| 32 | # running Sandbox can, and that Sandbox is this container: same image, | |
| 33 | # same volumes, same env. | |
| A third target, and the seam that was already waiting for it | 34 | sb = c.open_sandbox() |
| 35 | print(f"sandbox {sb.object_id} up, with {', '.join(c.volumes) or 'no volumes'}") | |
| 36 | print(f" attach: modal shell {sb.object_id} (from another terminal)") | |
| 37 | print("Ctrl-C here takes it down.") | |
| 38 | # Blocks on `sleep infinity`, which is the point: an ephemeral app stops | |
| 39 | # when its local entrypoint returns, and stopping the app terminates the | |
| 40 | # Sandbox with it -- so returning here would leave nothing to attach to. | |
| 41 | try: | |
| 42 | sb.wait() | |
| 43 | except KeyboardInterrupt: | |
| 44 | print("terminating") | |
| 45 | sb.terminate() |