Dockerfile не работает должным образом при использовании команды WORKDIR?

#docker #dockerfile

#docker #dockerfile

Вопрос:

Вот мой Dockerfile, который я хочу использовать для одного из моих веб-api с использованием python fastapi, но всякий раз, когда я пытаюсь его создать, я получаю приведенную ниже ошибку.

 FROM tiangolo/uvicorn-gunicorn:python3.8

RUN apt-get update amp;amp; 
    apt-get upgrade -y amp;amp; 
    apt-get dist-upgrade -y amp;amp; 
    apt-get autoremove -y amp;amp; 
    apt-get clean amp;amp; 
    apt-get autoclean amp;amp; 
    apt-get install -y gcc make apt-transport-https ca-certificates build-essential

RUN apt-get install -y curl autoconf automake libtool pkg-config git
RUN git clone https://github.com/openvenues/libpostal

WORKDIR /libpostal
RUN ./bootstrap.sh
RUN libpostal/configure --datadir=/opt
RUN libpostal/make -j $(nproc)
RUN libpostal/make install amp;amp; ldconfig



ENV PORT 8000
ENV APP_MODULE app.parser:app
ENV LOG_LEVEL debug
ENV WEB_CONCURRENCY 2

COPY ./requirements/base.txt ./requirements/base.txt
RUN pip install --no-cache-dir -r requirements/base.txt


COPY ./app /app/app
 

Всякий раз, когда я запускаю это, я получаю следующую ошибку,

 Sending build context to Docker daemon  4.262GB
Step 1/18 : FROM tiangolo/uvicorn-gunicorn:python3.8
 ---> 524e010ef786
Step 2/18 : ENV ENVIRONMENT staging
 ---> Using cache
 ---> d3e496ea9bbe
Step 3/18 : RUN apt-get update amp;amp;     apt-get upgrade -y amp;amp;     apt-get dist-upgrade -y amp;amp;     apt-get autoremove -y amp;amp;     apt-get clean amp;amp;     apt-get autoclean amp;amp;     apt-get install -y gcc make apt-transport-https ca-certificates build-essential
 ---> Using cache
 ---> cf3c1a8556e0
Step 4/18 : RUN apt-get install -y curl autoconf automake libtool pkg-config git
 ---> Using cache
 ---> 77879c6f66e9
Step 5/18 : RUN git clone https://github.com/openvenues/libpostal
 ---> Using cache
 ---> f1f7cf06e398
Step 6/18 : WORKDIR /libpostal
 ---> Running in 51191c3a69cb
Removing intermediate container 51191c3a69cb
 ---> d98ff97331db
Step 7/18 : RUN ./bootstrap.sh
 ---> Running in 40fd37f4900b
/bin/sh: 1: ./bootstrap.sh: not found
The command '/bin/sh -c ./bootstrap.sh' returned a non-zero code: 127
 

Пожалуйста, скажите мне, что я делаю не так в Dockerfile?

Комментарии:

1. Что вводит bootstrap.sh /libpostal ?

2. @kichik Git clone, клонирует репозиторий libpostal, и внутри него у нас будет файл bootstrap.sh

Ответ №1:

По умолчанию WORKDIR для вашего базового образа tiangolo / uvicorn-gunicorn:python3.8 /app . Я считаю, что это Dockerfile для базы. Когда вы клонировали репозиторий, вы фактически запускали его /app .

Вы можете явно установить WORKDIR / или указать WORKDIR /app/libpostal для успешного запуска сценария начальной загрузки.

Вы также должны настроить свои пути в RUN командах после клонирования, поскольку они должны быть относительными. Вот изменения, которые я предлагаю:

Вариант 1

 # this command is run in the /app folder, a default set in the base image
RUN git clone https://github.com/openvenues/libpostal

WORKDIR /app/libpostal
RUN ./bootstrap.sh
RUN ./configure --datadir=/opt
RUN make -j $(nproc)
RUN make install amp;amp; ldconfig
 

Вариант 2

 # explicitly set working directory in root
WORKDIR /
RUN git clone https://github.com/openvenues/libpostal

WORKDIR /libpostal
RUN ./bootstrap.sh
RUN ./configure --datadir=/opt
RUN make -j $(nproc)
RUN make install amp;amp; ldconfig