簡體   English   中英

為什么 Python 不能用於 Docker 入口點腳本?

[英]Why would Python not be available to a Docker Entrypoint Script?

這個 Python 3.9 項目有一個 Dockerfile,構建成功。 該文件使用ENTRYPOINT腳本創建一些目錄並在運行時處理一些清理工作。 它是一個 bash 腳本。 ENTRYPOINT腳本運行到最后都沒有問題,預計會執行接下來傳遞的CMD 好吧,我應該說這種行為只會在Kaniko構建圖像時發生。 在本地構建鏡像時,不會出現該問題。 但是,我願意將其歸因於本地位於 Windows 機器上這一事實。 但是,這在這里無關緊要,因為拋出的錯誤是:

/opt/project/conf/entrypoint.sh: /usr/bin/supervisord: /usr/bin/python3: bad interpreter: No such file or directory
/opt/project/conf/entrypoint.sh: line 8: /usr/bin/supervisord: Success

現在我看了很多“糟糕的解釋器”問題。 它們似乎都圍繞着口譯員在一個習慣的地方。 我依賴於 Python 3.9 解釋器的默認位置。 在 Debian Bullseye(基本映像背后的操作系統)上,應該是/usr/local/bin/python/usr/local/bin/python3 所以我完全不知道為什么它無法找到或使用它。

以下是實施細節:

Dockerfile :

FROM python:3.9-slim-bullseye

# Minimum Required Environment Variables
ENV SHELL=/bin/bash
ENV CC /usr/bin/gcc
ENV CXX /usr/bin/g++
ENV LANG=C.UTF-8
ENV DEBIAN_FRONTEND=noninteractive
ENV PYMSSQL_BUILD_WITH_BUNDLED_FREETDS=1
ENV PIP_CONFIG_FILE=/etc/pip.conf
ENV TZ=America/Los_Angeles

# Project Specific Environment Variables
ENV PROJECT_LOGFILE=/var/log/project/project.log
ENV PROJECT_CONFIG_DIRECTORY=/opt/project/conf
ENV PROJECT_SETTINGS_MODULE="project.settings"

# Files Needed for Dependency Installation
COPY dev/.pip.conf /etc/pip.conf
COPY dev/dev-requirements.txt /usr/local/requirements.txt

# Dependency Installation
WORKDIR /tmp
RUN apt-get  update \
    && apt-get upgrade -y \
    && apt-get install musl-dev g++ bash curl gnupg -y \
    && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
    && curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list \
    && apt-get  update \
    && apt-get install --no-install-recommends libfreetype-dev freetds-dev python-dev git libpng-dev libxml2-dev \
         libxslt-dev libssl-dev libopenblas-dev rsyslog supervisor tini tzdata libghc-zlib-dev libjpeg-dev cron \
         libgssapi-krb5-2 unixodbc-dev -y \
    && ACCEPT_EULA=Y apt-get install -y msodbcsql18 \
    && ln -s /usr/include/locale.h /usr/include/xlocale.h \
    && pip install --no-cache-dir --upgrade pip setuptools wheel \
    && pip install matplotlib --no-cache-dir \
    && pip install --no-cache-dir -r /usr/local/requirements.txt

# Setting Up For Install
COPY conf/ /opt/project/conf/
RUN mkdir -p /var/log/project /conf \
    && cp /opt/project/conf/supervisord.conf /conf/supervisord.conf \
    && cp /opt/project/conf/rsyslog.conf /conf/rsyslog.conf

WORKDIR /opt

# Copy Over Packages
COPY project-db-migrations /opt/project/project-db-migrations
COPY infrastructure /opt/infrastructure
COPY project /opt/project/src
COPY README.md /opt/project/README.md

# Install Infrastructure
RUN cd /opt/infrastructure && python3 setup.py install

# Install Project Service
RUN cd /opt/project/src && python3 setup.py install

RUN ["chmod", "+x", "/opt/project/conf/entrypoint.sh"]

WORKDIR /

EXPOSE 80

ENTRYPOINT ["tini", "--", "/opt/project/conf/entrypoint.sh"]
CMD ["supervisord", "-c", "/conf/supervisord.conf"]

entrypoint.sh

#!/bin/bash
set -eu

echo "Setting Up Project Service"

# Adding Temp Directory
mkdir -p /opt/project/tmp

echo "Service has been setup"

exec $@

supervisord.conf

[supervisord]
nodaemon=true
logfile=/var/log/project/supervisord.log
childlogdir=/var/log/project


[program:rsyslogd]
command=/usr/sbin/rsyslogd -n -f /conf/rsyslog.conf
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0


[program:crond]
command=/usr/sbin/cron -f -l 15
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0


[program:project]
command=python -m project.run --server
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

該圖像在未對用戶進行任何更改的情況下運行和部署,因此它應該以 root 用戶身份運行。

在這種情況下,經過一些挖掘,我發現 DevOps 運行的 Kaniko 版本存在問題 那是導致問題的原因。 由於圖像未正確拼合,Python 無法正常啟動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM