Search code examples
pythondockerdockerfileenvironment-variablesarguments

Specifying Package Installation Version in Dockerfile


I'm facing an issue while trying to specify the Poetry version directly in my Dockerfile. I want to declare the Poetry version in the Dockerfile itself without passing it as a build argument. Here's my Dockerfile and the error message:

Dockerfile:

# Base image for the Docker container.
ARG BASE_IMAGE=python:3.11.5-alpine3.18

# Specify the Poetry version directly in the Dockerfile.
ARG POETRY_VERSION=1.6.1

# Rest of your Dockerfile...

# System deps: install poetry with the specified version
RUN pip install "poetry==${POETRY_VERSION}"

Error Message:

 => ERROR [2/8] RUN pip install "poetry=="                                                                                                                                                                                                                          1.5s 
------
 > [2/8] RUN pip install "poetry==":
#0 1.210 Collecting poetry==
#0 1.478   Could not find a version that satisfies the requirement poetry== (from versions: 0.1.0, 0.2.0, 0.3.0, 0.4.0, 0.4.0.post1, 0.4.1, 0.4.2, 0.5.0b1, 0.5.0b2, 0.5.0, 0.6.0, 0.6.1, 0.6.2, 0.6.3b1, 0.6.3b2, 0.6.3b3, 0.6.3b4, 0.6.3b5, 0.6.3b6, 0.6.3b7, 0.6.3, 0.6.4b1, 0.6.4, 0.6.5, 0.7.0b1, 0.7.0b2, 0.7.0b3, 0.7.0b4, 0.7.0, 0.7.1, 0.8.0a0, 0.8.0a1, 0.8.0a2, 0.8.0a3, 0.8.0a4, 0.8.0, 0.8.1a0, 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5a0, 0.8.5, 0.8.6, 0.9.0a0, 0.9.0a1, 0.9.0a2, 0.9.0a3, 0.9.0, 0.9.1, 0.10.0a0, 0.10.0a1, 0.10.0a2, 0.10.0a3, 0.10.0, 0.10.1, 0.10.2, 0.10.3, 0.11.0a0, 0.11.0a1, 0.11.0a2, 0.11.0a3, 0.11.0a4, 0.11.0, 0.11.1, 0.11.2, 0.11.3, 0.11.4, 0.11.5, 0.12.0a0, 0.12.0a1, 0.12.0a2, 0.12.0a3, 0.12.0a4, 0.12.0a5, 0.12.0, 0.12.1, 0.12.2, 0.12.3, 0.12.4, 0.12.5, 0.12.6, 0.12.7, 0.12.8, 0.12.9, 0.12.10, 0.12.11, 0.12.12, 0.12.13, 0.12.14, 0.12.15, 0.12.16, 0.12.17, 1.0.0a0, 1.0.0a1, 1.0.0a2, 1.0.0a3, 1.0.0a4, 1.0.0a5, 1.0.0b1, 1.0.0b2, 1.0.0b3, 1.0.0b4, 1.0.0b5, 1.0.0b6, 1.0.0b7, 1.0.0b8, 1.0.0b9, 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.0.6, 1.0.7, 1.0.8, 1.0.9, 1.0.10, 1.1.0a1, 1.1.0a2, 1.1.0a3, 1.1.0b1, 1.1.0b2, 1.1.0b3, 1.1.0b4, 1.1.0rc1, 1.1.0, 1.1.1, 1.1.2, 1.1.3, 1.1.4, 1.1.5, 1.1.6, 1.1.7, 1.1.8, 1.1.9, 1.1.10, 1.1.11, 1.1.12, 1.1.13, 1.1.14, 1.1.15, 1.2.0a1, 1.2.0a2)
#0 1.480 No matching distribution found for poetry==
------
failed to solve: executor failed running [/bin/sh -c pip install "poetry==$POETRY_VERSION"]: exit code: 1

I've tried specifying the Poetry version directly in the Dockerfile, but it's still giving me this error. How can I correctly declare and use the Poetry version in my Dockerfile without encountering this issue?


Solution

  • Modify your Dockerfile to:

    ARG POETRY_VERSION=1.6.1
    RUN pip install "poetry==${POETRY_VERSION}"
    

    What is set above is the default value. Meaning, if you pass --build-arg POETRY_VERSION= (for building your docker image), that shall be picked up (instead of default value you set in Dockerfile).


    Also, an ARG declared before a FROM is outside of a build stage, so it can't be used in any instruction after a FROM statement. To use the default value of an ARG declared before the first FROM use an ARG instruction without a value inside of a build stage.

    ARG POETRY_VERSION=1.6.1
    
    FROM ...
    
    ARG POETRY_VERSION
    RUN pip install "poetry==${POETRY_VERSION}"