Search code examples
dockerrust-diesel

Cannot run installed tool in Dockerfile even though its there


I installed diesel-cli in a Dockerfile:

FROM alpine:latest
ENV PATH="/root/.cargo/bin:${PATH}"
RUN apk update
RUN apk add postgresql curl gcc musl-dev libpq-dev bash
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
WORKDIR /app

RUN cargo install diesel_cli --no-default-features --features postgres

COPY . .

EXPOSE 8000
CMD [ "docker/entrypoint.sh"]

That works fine. The entrypoint.sh is:

#!/bin/bash
export PATH="/root/.cargo/bin:${PATH}"

ls /root/.cargo/bin/diesel
bash -c "/root/.cargo/bin/diesel setup"

The strange this is that the ls shows that the diesel binary is there. But when running the docker container it still says:

bash: line 1: /root/.cargo/bin/diesel: No such file or directory

I also tried calling diesel right from the Dockerfile with the same result.

Why can't I run diesel this way?


Solution

  • See comment by The Fool!

    Using a different base image resolves the problem:

    FROM debian:bullseye-slim
    ENV PATH="/root/.cargo/bin:${PATH}"
    RUN apt update -y
    RUN apt install postgresql curl gcc libpq-dev bash -y
    RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
    
    WORKDIR /app
    
    # This may take a minute
    RUN cargo install diesel_cli --no-default-features --features postgres
    
    COPY . .
    # provision the database
    EXPOSE 8000
    CMD [ "docker/entrypoint.sh"]