skip to Main Content

Here’s the error after I try to run poetry directly (I gave up on PATH whilst troubleshooting) in a docker container:

Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "~/.local/share/pypoetry/venv/bin/poetry": stat ~/.local/share/pypoetry/venv/bin/poetry: no such file or directory: unknown

Dockerfile:

FROM python:3.10

# to run poetry directly as soon as it's installed
ENV PATH="/root/.local/bin:$PATH"

# INSTALL POETRY
RUN apt-get update 
    && apt-get install -y curl 
    && curl -sSL https://install.python-poetry.org | python3 - 

# set work directory
WORKDIR /app

# Install dependencies
COPY poetry.lock pyproject.toml /app/
RUN ~/.local/share/pypoetry/venv/bin/poetry install --no-root

# copy files to Container
COPY ./. /app
CMD ["~/.local/share/pypoetry/venv/bin/poetry", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

docker-compose.yml

# Docker compose file for nginx and letsencrypt
version: "3.10"
services:
  fastapi:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: fastapi
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - .:/app

What’s strange is, poetry will actually build and install all those dependencies first, I watch them get instaled. Then when I try and use poetry at the cmd line, you the build errors out producing the error above. Suddently by that point in the build, the poetry installation is gone?

2

Answers


  1. The $HOME directory is the working directory that you set.
    So when you execute RUN ~/.local/share/pypoetry/venv/bin/poetry
    the full path is app/.local/share/pypoetry/venv/bin/poetry
    when it should be root/.local/share/pypoetry/venv/bin/poetry.

    Either define the full path or set the root dir as working directory

    Login or Signup to reply.
  2. You’re using the JSON-array form of CMD. This doesn’t run a shell and doesn’t to any sort of variable expansion. In particular, ~ referring to the current user’s home directory is a convenience offered by the shell, but since you’re not running a shell here, the system instead interprets it as looking for a subdirectory of the current directory literally named ~.

    The shortest solution is to spell out the absolute path here

    CMD ["/root/.local/share/pypoetry/venv/bin/poetry", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
    #     ^^^^^ explicitly spell out user's home directory
    

    You try to set $PATH earlier, and another approach here could be to add the Poetry virtual environment to $PATH.

    ENV PATH="/root/.local/bin:/root/.local/share/pypoetry/venv/bin:$PATH"
    #                      add ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    ...
    
    RUN poetry install --no-root
    CMD ["poetry", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
    

    It looks like it might be possible to install Poetry using pip in which case you could install it outside a virtual environment, or poetry export your project’s dependencies to a requirements.txt file that you could more directly RUN pip install -r into the image’s "system" Python.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search