這是我的 docker 檔案,
FROM ubuntu:20.04
ARG DEBIAN_FRONTEND=noninteractive
RUN apt update && apt upgrade -y
RUN apt install -y -q software-properties-common
RUN apt install -y -q build-essential python3-pip python3-dev
RUN 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 libreoffice wget
RUN apt-get install -y g
RUN apt-get install -y autoconf automake libtool
RUN apt-get install -y pkg-config
RUN apt-get install -y libpng-dev
RUN apt-get install -y libjpeg8-dev
RUN apt-get install -y libtiff5-dev
RUN apt-get install -y zlib1g-dev
RUN apt-get install -y libleptonica-dev
RUN apt-get install -y libicu-dev libpango1.0-dev libcairo2-dev
# python dependencies
RUN pip3 install -U pip setuptools wheel
RUN pip3 install gunicorn uvloop httptools dvc[s3]
RUN pip3 install nltk
RUN python3 -c "import nltk;nltk.download('stopwords')"
# copy required files
RUN bash -c 'mkdir -p /app/{app,models,requirements}'
COPY ./config.yaml /app
COPY ./models /app/models
COPY ./requirements /app/requirements
COPY ./app /app/app
# tensorflow serving for models
RUN echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | tee /etc/apt/sources.list.d/tensorflow-serving.list && \
curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | apt-key add -
RUN apt-get update && apt-get install tensorflow-model-server
RUN tensorflow_model_server --port=8500 --rest_api_port=8501 --model_config_file=/app/models/model.conf --model_base_path=/app/models &
ENTRYPOINT /usr/local/bin/gunicorn \
-b 0.0.0.0:80 \
-w 1 \
-k uvicorn.workers.UvicornWorker app.main:app \
--timeout 120 \
--chdir /app \
--log-level 'info' \
--error-logfile '-'\
--access-logfile '-'
無論我做什么,在運行 docker 鏡像時,下面這行都不會執行,
運行 tensorflow_model_server --port=8500 --rest_api_port=8501 --model_config_file=/app/models/model.conf --model_base_path=/app/models &
為什么會這樣?我怎樣才能在后臺運行上面的命令并轉到 docker 檔案中的入口點。任何幫助表示贊賞。
uj5u.com熱心網友回復:
您應該能夠創建一個單獨的 Dockerfile,它只運行 TensorFlow 服務器:
FROM ubuntu:20.04
# Install the server
RUN echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | tee /etc/apt/sources.list.d/tensorflow-serving.list \
&& curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | apt-key add - \
&& apt-get update \
&& DEBIAN_FRONTEND=noninteractive \
apt-get install --no-install-recommends --assume-yes \
tensorflow-model-server
# Copy our local models into the image
COPY ./models /models
# Make the server be the main container command
CMD tensorflow_model_server --port=8500 --rest_api_port=8501 --model_config_file=/models/model.conf --model_base_path=/models
然后您可以從主應用程式的 Dockerfile 中洗掉類似的行。
完成此操作后,您可以設定啟動兩個容器的 Docker Compose 設定:
version: '3.8'
services:
application:
build: .
ports: ['8000:80']
environment:
- TENSORFLOW_URL=http://tf:8500
tf:
build:
context: .
dockerfile: Dockerfile.tensorflow
# ports: ['8500:8500', '8501:8501']
您的應用程式將需要知道尋找那個os.environ['TENSORFLOW_URL']。現在你有兩個容器,每個容器都CMD運行一個前臺行程。
在較低級別,Docker 鏡像不包含任何正在運行的行程;把它想象成一個 tar 檔案加上一個要運行的命令列。您在RUN命令的后臺啟動的任何內容都會在該RUN命令完成后立即終止。
uj5u.com熱心網友回復:
這是為什么?
因為您的 docker 容器配置為 run /usr/local/bin/gunicorn,如ENTRYPOINT指令所定義。
如何在后臺運行上述命令并轉到 docker 檔案中的入口點。
執行此操作的標準方法是撰寫一個包裝腳本來執行您需要的所有程式。所以對于這個例子,類似于run.sh:
#!/bin/bash
# Start tensorflow server
tensorflow_model_server --port=8500 --rest_api_port=8501 --model_config_file=/app/models/model.conf --model_base_path=/app/models &
# Start gunicorn
/usr/local/bin/gunicorn \
-b 0.0.0.0:80 \
-w 1 \
-k uvicorn.workers.UvicornWorker app.main:app \
--timeout 120 \
--chdir /app \
--log-level 'info' \
--error-logfile '-'\
--access-logfile '-'
然后在 Dockerfile 中:
ADD run.sh /usr/local/bin/run.sh
RUN chmod x /usr/local/bin/run.sh
ENTRYPOINT /usr/local/bin/run.sh
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/381026.html
