#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