繁体   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