Fabien Punin
12/20/2024, 11:18 AMname: test
prefect-version: 3.1.6
deployments:
- name: test_flow_x_hourly_deployment
version: "1"
tags: null
description: This deployment runs flow x hourly
schedules:
- cron: "0 0 * * *"
timezone: "Europe/Paris"
active: "true"
flow_name: flow_1
entrypoint: src/projects/test/prefect/flows/flow_1.py:sample_flow
parameters:
input_data: "Hello, World!"
work_pool:
name: ecs-fargate-workpool
work_queue_name: default
job_variables:
image: '{{ $IMAGE_NAME }}:{{ $IMAGE_TAG }}'
Below is my dockerfile from which the image is built
FROM prefecthq/prefect:3.1.6-python3.11
ARG PROJECT_PATH
WORKDIR /app
RUN pip install uv
COPY uv.lock .
COPY pyproject.toml .
RUN uv sync
COPY src/common src/common
COPY ${PROJECT_PATH} ${PROJECT_PATH}
ENV PATH=".venv/bin:$PATH"
ENTRYPOINT []
My flow crashes with the error
Flow run infrastructure exited with non-zero status code:
Exited with non 0 code. (Error Code: 1)
This may be caused by attempting to run an image with a misspecified platform or architecture.
What could I be missing?Marvin
12/20/2024, 11:18 AMI'm using Prefect 3 and trying to deploy my first flow on an ECS fargate push work pool created using the prefect cli.I'm baking the flow and task code directly into a docker image stored on a private ECR registry. Below is my prefect.yaml file where the image name and tag are properly populated (it is stored in ecr).
name: test
prefect-version: 3.1.6
deployments:
- name: test_flow_x_hourly_deployment
version: "1"
tags: null
description: This deployment runs flow x hourly
schedules:
- cron: "0 0 * * *"
timezone: "Europe/Paris"
active: "true"
flow_name: flow_1
entrypoint: src/projects/test/prefect/flows/flow_1.py:sample_flow
parameters:
input_data: "Hello, World!"
work_pool:
name: ecs-fargate-workpool
work_queue_name: default
job_variables:
image: '{{ $IMAGE_NAME }}:{{ $IMAGE_TAG }}'
Below is my dockerfile from which the image is built
```FROM prefecthq/prefect:3.1.6-python3.11
ARG PROJECT_PATH
WORKDIR /app
RUN pip install uv
COPY uv.lock .
COPY pyproject.toml .
RUN uv sync
COPY src/common src/common
COPY ${Marvin
12/20/2024, 11:22 AMI'm using Prefect 3 and deploying a flow on an ECS fargate workpool created with prefect cli.Flow and task code are baked in a docker image stored on ECR. prefect.yaml file
name: test
prefect-version: 3.1.6
deployments:
- name: test_flow_x_hourly_deployment
version: "1"
tags: null
description: This deployment runs flow x hourly
schedules:
- cron: "0 0 * * *"
timezone: "Europe/Paris"
active: "true"
flow_name: flow_1
entrypoint: src/projects/test/prefect/flows/flow_1.py:sample_flow
parameters:
input_data: "Hello, World!"
work_pool:
name: ecs-fargate-workpool
work_queue_name: default
job_variables:
image: '{{ $IMAGE_NAME }}:{{ $IMAGE_TAG }}'
Dockerfile from which the image is built
FROM prefecthq/prefect:3.1.6-python3.11
ARG PROJECT_PATH
WORKDIR /app
RUN pip install uv
COPY uv.lock .
COPY pyproject.toml .
RUN uv sync
COPY src/common src/common
COPY ${PROJECT_PATH} ${PROJECT_PATH}
ENV PATH=".venv/bin:$PATH"
ENTRYPOINT []
Flow crashes with
```Flow run infrastructure exited with nonMarvin
12/20/2024, 11:24 AMDeploying a flow on ECS workpool created with prefect cli.Flow and task code are in docker image on ECR. prefect.yaml file
name: test
prefect-version: 3.1.6
deployments:
- name: test_flow_x_hourly_deployment
version: "1"
tags: null
description: This deployment runs flow x hourly
schedules:
- cron: "0 0 * * *"
timezone: "Europe/Paris"
active: "true"
flow_name: flow_1
entrypoint: src/projects/test/prefect/flows/flow_1.py:sample_flow
parameters:
input_data: "Hello, World!"
work_pool:
name: ecs-fargate-workpool
work_queue_name: default
job_variables:
image: '{{ $IMAGE_NAME }}:{{ $IMAGE_TAG }}'
Dockerfile file
FROM prefecthq/prefect:3.1.6-python3.11
ARG PROJECT_PATH
WORKDIR /app
RUN pip install uv
COPY uv.lock .
COPY pyproject.toml .
RUN uv sync
COPY src/common src/common
COPY ${PROJECT_PATH} ${PROJECT_PATH}
ENV PATH=".venv/bin:$PATH"
ENTRYPOINT []
Flow crashes with
```Flow run infrastructure exited with non-zero status code:
Exited with non 0 code. (Error Code: 1Fabien Punin
12/20/2024, 11:25 AMname: test
prefect-version: 3.1.6
deployments:
- name: test_flow_x_hourly_deployment
version: "1"
flow_name: flow_1
entrypoint: src/projects/test/prefect/flows/flow_1.py:sample_flow
parameters:
input_data: "Hello, World!"
work_pool:
name: ecs-fargate-workpool
work_queue_name: default
job_variables:
image: '{{ $IMAGE_NAME }}:{{ $IMAGE_TAG }}'
Dockerfile file
FROM prefecthq/prefect:3.1.6-python3.11
ARG PROJECT_PATH
WORKDIR /app
RUN pip install uv
COPY uv.lock .
COPY pyproject.toml .
RUN uv sync
COPY src/common src/common
COPY ${PROJECT_PATH} ${PROJECT_PATH}
ENV PATH=".venv/bin:$PATH"
ENTRYPOINT []
Flow crashes with
Flow run infrastructure exited with non-zero status code
This may be caused by attempting to run an image with a misspecified platform or architecture.
Any advice?Marvin
12/20/2024, 11:25 AMdocker inspect <your-image>
to ensure the architecture matches your ECS task specifications.
3. Entrypoint and CMD in Dockerfile: Make sure your ENTRYPOINT
and CMD
are correctly set. As you have an empty ENTRYPOINT []
, it relies heavily on Prefect setting the correct entry point and commands. Verify Prefect is passing correct configurations.
4. Common Dependency Issues: Sometimes, missing or incorrectly specified dependencies can lead to runtime errors. Ensure that all necessary Python packages are installed and available in your Docker image.
5. Checking Logs: Utilize ECS logs to get more specific errors that might help diagnose the issue. Prefect might not capture all error messages, and ECS logs can provide more detailed insights.
For further reference, please see the Prefect documentation and this section on Docker infrastructure examples, which walks through common deployment practices and troubleshooting.
Deployments can sometimes feel like you're hitchhiking through a galaxy of configurations—without a towel. Keep calm, and check the logs!Fabien Punin
12/20/2024, 11:33 AMFabien Punin
12/20/2024, 12:55 PMMarvin
12/20/2024, 12:55 PMt2.micro
, t3.medium
, etc., are compatible with x86_64 (amd64).
- If the instance types are ARM-based like t4g.micro
or a1.medium
, the architecture will not be compatible.
Alternatively, if you're using Fargate, double-check the platform version:
- Fargate with PC2 (amd64): Default configurations should be fine for amd64.
- Fargate support for ARM: Make sure you’re not using settings specific to ARM-based platforms unless intentionally.
If things still seem out of place, you might want to create a new task definition with explicit architecture settings where possible, or consult the ECS Platform Versions and Compatibility documentation.
If something doesn't add up and feels like it's an outer space issue, you may want to consult your friendly neighboring AWS support.Fabien Punin
12/20/2024, 1:28 PMMarvin
12/20/2024, 1:28 PMENTRYPOINT []
, which is an empty entrypoint, meaning Prefect can fully control what command sequence the container will execute.
2. Overriding Entrypoint in Prefect: When you configure a deployment in Prefect, you specify the entrypoint
parameter. This isn't directly related to Docker's entrypoint but refers to the Python file and function in your flow. Prefect uses this to determine what to execute.
3. Setting Entrypoint: If you want to set a specific entrypoint behavior in Docker while giving Prefect flexibility to use its parameters, you can use:
dockerfile
ENTRYPOINT ["prefect", "execute", "flow-run"]
This setup allows Prefect to invoke the necessary flow with the appropriate orchestrated commands.
4. How Prefect Uses the Entrypoint: Prefect doesn't directly override the Docker entrypoint. Instead, it passes the flow definition and parameters as arguments to whatever the entrypoint command is. Since you've set an empty entrypoint, it relies entirely on Prefect’s orchestration.
5. Adjust Using Prefect Commands Directly: If you wish for Prefect to handle all flow-related commands, you can leave the entrypoint either empty (as you have done) or explicitly include Prefect’s execution commands. This flexibility allows for Runtime Environment Variable Overrides through job settings in Prefect configurations.
If you're looking for more detailed instructions on using Prefect with Docker, check out this Prefect Docker documentation. It provides examples and configurations that might closely relate to your use case.
Think of Prefect as having the ultimate say in what goes on inside the container, much like a chef running a spaceship canteen—getting the recipes right is half your battle won!Fabien Punin
12/20/2024, 1:33 PMMarvin
12/20/2024, 1:33 PMAmazonECSTaskExecutionRolePolicy
policy to this role. This policy allows ECS to pull images from ECR and send logs to CloudWatch.
- Trust Relationship: Update the trust relationship of this role to include ECS tasks:
json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "<http://ecs-tasks.amazonaws.com|ecs-tasks.amazonaws.com>"
},
"Action": "sts:AssumeRole"
}
]
}
2. ECS Service Role:
- Ensure that your ECS service is configured to use this IAM role as the task execution role.
3. ECR Repository Policies (if needed):
- Navigate to your ECR repository and ensure permissions allow the service to pull images. By default, if you're using an IAM role with correct permissions, this should already be covered.
4. IAM User and Credentials (Alternate Method):
- Access Keys: If you are using IAM user credentials instead, ensure you have access keys with the right permissions. This is less recommended for ECS but may be relevant in other contexts.
- Store Credentials Securely: Use AWS secrets management or an environment variable configuration to securely provide these credentials.
5. Configure Fargate Task Role: If using Fargate, similar configurations apply, where you assign the task execution role with ECR access policies.
6. AWS CLI Access (Testing Locally or Debugging):
- Make sure your AWS CLI is configured to use an IAM user or role with permissions to pull from ECR if you are testing locally.
7. VPC and Network Configurations:
- Ensure your ECS tasks have network access to ECR, typically allowing through a VPC endpoint or appropriate internet gateway if they're in a public subnet.
In summary, having your ECS task execution IAM role configured with the necessary permissions is key, as it's responsible for communicating with ECR to pull the images. If that role is correctly set, Prefect should be able to orchestrate deployments smoothly.
When configuring your roles and policies, think of yourself as a meticulous air traffic controller—one wrong permission might lead to a metaphorical landing mishap!Fabien Punin
12/20/2024, 1:48 PMFROM <http://ghcr.io/astral-sh/uv:python3.11-bookworm-slim|ghcr.io/astral-sh/uv:python3.11-bookworm-slim>
ARG PROJECT_PATH
# Set working directory
WORKDIR /app
# Enable bytecode compilation
ENV UV_COMPILE_BYTECODE=1
# Copy from the cache instead of linking since it's a mounted volume
ENV UV_LINK_MODE=copy
# Install the project's dependencies using the lockfile and settings
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=uv.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv sync --frozen --no-install-project --no-dev
# Then, add the rest of the project source code and install it
# Installing separately from its dependencies allows optimal layer caching
COPY pyproject.toml .
COPY uv.lock .
COPY src/common src/common
COPY ${PROJECT_PATH} ${PROJECT_PATH}
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --frozen --no-dev
COPY src/common src/common
COPY ${PROJECT_PATH} ${PROJECT_PATH}
# Place executables in the environment at the front of the path
ENV PATH="/app/.venv/bin:$PATH"
# Reset the entrypoint, don't invoke `uv`
ENTRYPOINT []
My prefect.yaml file
# Generic metadata about this project
name: test
prefect-version: 3.1.6
# the deployments section allows you to provide configuration for deploying flows
deployments:
- name: test_flow_x_hourly_deployment
version: "1"
tags: null
description: This deployment runs flow x hourly
schedules:
- cron: "0 0 * * *"
timezone: "Europe/Paris"
active: "true"
flow_name: flow_1
entrypoint: src/projects/test/prefect/flows/flow_1.py:sample_flow
parameters:
input_data: "Hello, World!"
work_pool:
name: ecs-fargate-workpool
work_queue_name: default
job_variables:
image: '{{ $IMAGE_NAME }}:{{ $IMAGE_TAG }}'
Marvin
12/20/2024, 1:48 PMknowing the flow and task code is baked into my docker image, do I need a pull step in my prefect.yaml deployment file?My dockerfile: ```FROM ghcr.io/astral-sh/uv:python3.11-bookworm-slim ARG PROJECT_PATH # Set working directory WORKDIR /app # Enable bytecode compilation ENV UV_COMPILE_BYTECODE=1 # Copy from the cache instead of linking since it's a mounted volume ENV UV_LINK_MODE=copy # Install the project's dependencies using the lockfile and settings RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ uv sync --frozen --no-install-project --no-dev # Then, add the rest of the project source code and install it # Installing separately from its dependencies allows optimal layer caching COPY pyproject.toml . COPY uv.lock . COPY src/common src/common COPY ${PROJECT_PATH} ${PROJECT_PATH} RUN --mount=type=cache,target=/root/.cache/uv \ uv sync --frozen --no-dev COPY src/common src/common COPY ${PROJECT_PATH} ${PROJECT_PATH} # Place executables in the
Fabien Punin
12/20/2024, 1:49 PM# Generic metadata about this project
name: test
prefect-version: 3.1.6
# the deployments section allows you to provide configuration for deploying flows
deployments:
- name: test_flow_x_hourly_deployment
version: "1"
tags: null
description: This deployment runs flow x hourly
schedules:
- cron: "0 0 * * *"
timezone: "Europe/Paris"
active: "true"
flow_name: flow_1
entrypoint: src/projects/test/prefect/flows/flow_1.py:sample_flow
parameters:
input_data: "Hello, World!"
work_pool:
name: ecs-fargate-workpool
work_queue_name: default
job_variables:
image: '{{ $IMAGE_NAME }}:{{ $IMAGE_TAG }}'
Marvin
12/20/2024, 1:50 PMprefect.yaml
deployment file. The pull
step is typically required when your flow code is stored in a remote repository (like GitHub) and needs to be retrieved at runtime.
Your deployment is configured to use a Docker image that contains everything necessary to run your flow. As long as the job_variables.image
is correctly set in the deployment with the appropriate ECR image name and tag, Prefect will handle executing the flow as the ECS task pulls and runs the image.
In this setup, Prefect's orchestration commands within the container should take over and execute the defined entrypoint using the baked-in code.
So, you're all set without needing an explicitly configured pull step in the `prefect.yaml`—unless you're longing for a reason to pull things just for nostalgia's sake. Carry on with the orchestration, and let those flows run!Fabien Punin
12/20/2024, 1:52 PMprefect.deployments.steps.set_working_directory
Should I use this at all?Marvin
12/20/2024, 1:53 PMprefect.deployments.steps.set_working_directory
step is used to set the working directory for the process prior to importing your flow. This step can be helpful if your flow code is not stored in the root of your Docker image and you need to navigate to the appropriate directory to execute the flow.
In your specific case with the flow and task code baked into the Docker image, and assuming that the paths in the prefect.yaml
correctly point to your code (entrypoint: src/projects/test/prefect/flows/flow_1.py:sample_flow
), there's typically no need to explicitly use the set_working_directory
step unless:
1. Flow Location: Your flow code is stored in a subdirectory that needs to be set as the working directory before execution.
2. Complex Directory Structure: You have a more complex directory structure that requires specific navigation for relative paths in your flow.
If everything works without it and your Docker image's work directory defaults to the correct path, you might not need to specify this step. However, if you encounter issues related to file or module paths not being found, revisiting this setting could be helpful.
For more insights, refer to this Prefect documentation on infrastructure concepts here.
Remember, setting the correct working directory can feel like launching a ship without forgetting the fuel—whenever necessary, of course!Fabien Punin
12/21/2024, 5:43 PMDecember 21, 2024 at 18:12 (UTC+1:00)
17:12:35.037 | ERROR | prefect.engine - Engine execution of flow run 'd23bdfa0-586e-42f9-9dae-9ed861d8bd0c' exited with unexpected exception
prefect
December 21, 2024 at 18:12 (UTC+1:00)
Traceback (most recent call last):
prefect
December 21, 2024 at 18:12 (UTC+1:00)
File "/app/.venv/lib/python3.11/site-packages/prefect/deployments/steps/core.py", line 163, in run_steps
prefect
December 21, 2024 at 18:12 (UTC+1:00)
step_output = await run_step(step, upstream_outputs)
prefect
December 21, 2024 at 18:12 (UTC+1:00)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
prefect
December 21, 2024 at 18:12 (UTC+1:00)
File "/app/.venv/lib/python3.11/site-packages/prefect/deployments/steps/core.py", line 119, in run_step
prefect
December 21, 2024 at 18:12 (UTC+1:00)
raise ValueError(
prefect
December 21, 2024 at 18:12 (UTC+1:00)
ValueError: Step has unexpected additional keys: prefect.deployments.steps.set_working_directory
Here is my prefect.yaml file
# Generic metadata about this project
name: test # UPDATE with project name
prefect-version: 3.1.6
pull:
- prefect.deployments.steps.set_working_directory:
directory: /app/
# the deployments section allows you to provide configuration for deploying flows
deployments:
- name: test_flow_x_hourly_deployment # UPDATE with deployment name (1 project can have multiple deployments)
version: "1" # Increment with each deployment
tags: null
description: This deployment runs flow x hourly # UPDATE with deployment description
schedules: # UPDATE with scheduling, options available here <https://docs.prefect.io/v3/deploy/infrastructure-concepts/prefect-yaml#schedule-fields>
- cron: "0 0 * * *"
timezone: "Europe/Paris"
active: "true"
flow_name: flow_1 # UPDATE with flow name as to appear on Prefect UI
entrypoint: src/projects/test/prefect/flows/flow_1.py:sample_flow # UPDATE with path to flow file and flow method in the docker container
parameters: # UPDATE with flow parameters
input_data: "Hello, World!"
work_pool:
name: ecs-fargate-workpool
work_queue_name: default
job_variables:
image: '{{ $IMAGE_NAME }}:{{ $IMAGE_TAG }}'
Marvin
12/21/2024, 5:43 PMMy deployment run fails with the following logs:```December 21, 2024 at 18:12 (UTC+1:00) 171235.037 | ERROR | prefect.engine - Engine execution of flow run 'd23bdfa0-586e-42f9-9dae-9ed861d8bd0c' exited with unexpected exception prefect December 21, 2024 at 18:12 (UTC+1:00) Traceback (most recent call last): prefect December 21, 2024 at 18:12 (UTC+1:00) File "/app/.venv/lib/python3.11/site-packages/prefect/deployments/steps/core.py", line 163, in run_steps prefect December 21, 2024 at 18:12 (UTC+1:00) step_output = await run_step(step, upstream_outputs) prefect December 21, 2024 at 18:12 (UTC+1:00) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ prefect December 21, 2024 at 18:12 (UTC+1:00) File "/app/.venv/lib/python3.11/site-packages/prefect/deployments/steps/core.py", line 119, in run_step prefect December 21, 2024 at 18:12 (UTC+1:
Fabien Punin
12/21/2024, 5:46 PM17:12:35.037 | ERROR | prefect.engine - Engine execution of flow run 'd23bdfa0-586e-42f9-9dae-9ed861d8bd0c' exited with unexpected exception
Traceback (most recent call last):
File "/app/.venv/lib/python3.11/site-packages/prefect/deployments/steps/core.py", line 163, in run_steps
step_output = await run_step(step, upstream_outputs)
File "/app/.venv/lib/python3.11/site-packages/prefect/deployments/steps/core.py", line 119, in run_step
raise ValueError(
ValueError: Step has unexpected additional keys: prefect.deployments.steps.set_working_directory
My prefect.yaml
name: test
prefect-version: 3.1.6
pull:
- prefect.deployments.steps.set_working_directory:
directory: /app/
deployments:
- name: test_flow_x_hourly_deployment
tags: null
entrypoint: src/projects/test/prefect/flows/flow_1.py:sample_flow
work_pool:
name: ecs-fargate-workpool
work_queue_name: default
job_variables:
image: '{{ $IMAGE_NAME }}:{{ $IMAGE_TAG }}'
Marvin
12/21/2024, 5:46 PMprefect.deployments.steps.set_working_directory
step in your prefect.yaml
file. This step isn't directly supported or expected in the pull
or other sections as you've configured it.
Here’s how you can address the issue:
1. Remove the pull
Step: Since your flow and task code are baked into your Docker image, you don't actually need to use a pull
step in this configuration. Prefect expects to execute the flow from the entrypoint specified and doesn't need additional steps to change the working directory unless sourcing from a remote location.
2. Docker Image and Entrypoint: Make sure your Docker image’s default work directory is set correctly, or include a command in your Dockerfile to set the WORKDIR
if needed. This ensures that your entrypoint can successfully find and execute the specified flow path.
3. Correct prefect.yaml
Configuration: Remove the unnecessary pull
step to prevent further errors. Your configuration should focus just on the essential settings like the right image and work pool.
Here's how your prefect.yaml
might look after removing the pull step:
yaml
name: test
prefect-version: 3.1.6
deployments:
- name: test_flow_x_hourly_deployment
tags: null
entrypoint: src/projects/test/prefect/flows/flow_1.py:sample_flow
work_pool:
name: ecs-fargate-workpool
work_queue_name: default
job_variables:
image: '{{ $IMAGE_NAME }}:{{ $IMAGE_TAG }}'
If everything else is properly configured, removing this line should help resolve the issue, enabling Prefect to manage the job execution without encountering unexpected keys. Imagine Prefect as your diligent assistant who doesn't appreciate surprises in the instruction manual!Fabien Punin
12/21/2024, 5:53 PMFile "/app/.venv/lib/python3.11/site-packages/prefect/deployments/steps/pull.py", line 32, in set_working_directory
os.chdir(directory)
FileNotFoundError: [Errno 2] No such file or directory: '/home/runner/work/opsima-data/opsima-data'
Marvin
12/21/2024, 5:54 PMentrypoint
parameter (src/projects/test/prefect/flows/flow_1.py:sample_flow
) correctly points to the location of your flow in the Docker image.
2. Docker Image Default Work Directory:
- Specify the correct working directory in your Dockerfile to match where your code is placed. You can do this using the WORKDIR
directive:
dockerfile
WORKDIR /app
3. Verify Copied Code Paths:
- When building your Docker image, ensure the COPY commands in your Dockerfile are placing the code in the expected directories. Your Dockerfile should look something like this:
dockerfile
COPY ${PROJECT_PATH} /app/src/projects/test/prefect/flows/
4. Debugging the Docker Image:
- Run your Docker image locally, and use a shell to verify that the files are in the correct location:
bash
docker run -it --entrypoint /bin/sh your-image-name
- Once inside the container, navigate to /app
or where you expect your code to be, and ensure the paths match.
5. Prefect Configuration Paths:
- Double-check your Prefect configuration and entrypoint settings. If necessary, update them to align with your confirmed directory structure.
The error suggests that Prefect cannot find the specified directory, so ensuring your Docker setup accurately aligns with the paths in the entrypoint
and Dockerfile means that Prefect can successfully navigate to and execute the flow.
If everything is verified, it's like finally tuning the knob to unlock seamless orchestration—without any legendary directory treks!Leonardo Perazzini
01/03/2025, 6:38 PMLeonardo Perazzini
01/03/2025, 7:32 PMFabien Punin
01/04/2025, 5:55 PMLeonardo Perazzini
01/04/2025, 7:33 PMFabien Punin
01/04/2025, 8:00 PMNate
01/04/2025, 8:03 PMFabien Punin
01/04/2025, 8:19 PMuv
ENTRYPOINT []
CMD []Fabien Punin
01/04/2025, 8:24 PM