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
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 directoryYou’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
You try to set
$PATH
earlier, and another approach here could be to add the Poetry virtual environment to$PATH
.It looks like it might be possible to install Poetry using
pip
in which case you could install it outside a virtual environment, orpoetry export
your project’s dependencies to arequirements.txt
file that you could more directlyRUN pip install -r
into the image’s "system" Python.