Как установить корень питона в рабочий каталог Dockerfile - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть простой Dockerfile:

FROM python:3.6-alpine
RUN apk add -U --no-cache gcc build-base linux-headers ca-certificates python3-dev libffi-dev libressl-dev libxslt-dev
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . app/
WORKDIR /app

ENV FLASK_APP app.py

EXPOSE 5000
ENTRYPOINT [ "python" ]

CMD ["-m", "flask", "run"]

Когда я запускаю приложение локально (не в Docker), все в порядке.Однако, поскольку все приложение перемещено в рабочий каталог /app, модули больше не распознаются.Мне нужно сделать это, чтобы заставить его работать:

from app.my_module import MyClass

Как мне сказать python, что корень /app, а не /?

1 Ответ

0 голосов
/ 12 февраля 2019

Проблема

ENV FLASK_APP app.py

Измените его на:

ENV FLASK_APP=/app/app.py

CMD ["-m", "flask", "run"]

Вам нужно только flask run -h 0.0.0.0, а не python -m flask run ... и если вы сделаете это, вы можете полностью удалить строку ENTRYPOINT или вместо этого добавить инструкцию колбына входную точку и удалите CMD.

-h 0.0.0.0 необходим при работе внутри контейнера, в противном случае он будет привязан к 127.0.0.1, который является локальным узлом внутри контейнера, поэтому недоступен из браузера хост-компьютера.

ENTRYPOINT ["python"]

Вы устанавливаете Python 3, но, похоже, вы используете Python 2 ... Проверьте, действительно ли python указываетдо версии Python, в которой вы собираетесь запускать свое приложение.

Безопасность

Никогда не запускайте приложения в докер-контейнере с правами root, как вы не делали бы на голом железном сервере или вVPS.Просто создайте обычного пользователя и запустите приложение непривилегированным способом.

Лучшее решение

Используйте вместо этого Dockerfile для сервера Python в качестве источника вдохновения для вашего варианта использования.

Просто адаптируйте Dockerfile для запуска с alpine и замените команды для ubuntu эквивалентными в Alpine.

FROM ubuntu:18.04

ARG CONTAINER_USER="python"
ARG CONTAINER_UID="1000"
ARG DISPLAY=":0.0"
ARG ZSH_THEME="robbyrussell"

# Will not prompt for questions
ENV DEBIAN_FRONTEND=noninteractive \
    CONTAINER_USER=python \
    CONTAINER_UID=1000 \
    ROOT_CA_DIR=/root-ca/ \
    PROXY_CA_FILENAME="FirewallProxyCA.crt" \
    PROXY_CA_PEM="certificates/FirewallProxyCA.crt" \
    PROXY_CA_NAME="FirewallProxy"

COPY ./setup ${ROOT_CA_DIR}

RUN apt update && \
    apt -y upgrade && \
    apt -y install \
      ca-certificates \
      locales \
      tzdata \
      inotify-tools \
      libnss3-tools \
      curl \
      git \
      zsh \
      unzip \
      libxss1 \
      python-pip \
      python3-pip && \

    locale-gen en_GB.UTF-8 && \
    dpkg-reconfigure locales && \

    #https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers
    printf "fs.inotify.max_user_watches=524288\n" >> /etc/sysctl.conf && \

    useradd -m -u ${CONTAINER_UID} -s /bin/bash ${CONTAINER_USER} && \

    cd ${ROOT_CA_DIR} && \
    ./add-proxy-certificate.sh "${PROXY_CA_PEM}" && \

    # Install Oh My Zsh for Root and Node user
    bash -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" && \
    chsh -s /usr/bin/zsh && \
    cp -R /root/.oh-my-zsh /home/"${CONTAINER_USER}" && \
    cp /root/.zsh* /home/"${CONTAINER_USER}" && \
    sed -i "s/\/root/\/home\/${CONTAINER_USER}/g" /home/"${CONTAINER_USER}"/.zshrc && \
    chown -R "${CONTAINER_USER}":"${CONTAINER_USER}" /home/"${CONTAINER_USER}" && \
    sed -i s/ZSH_THEME=\"robbyrussell\"/ZSH_THEME=\"${ZSH_THEME}\"/g /home/${CONTAINER_USER}/.zshrc

ENV LANG=en_GB.UTF-8 \
    LANGUAGE=en_GB:en \
    LC_ALL=en_GB.UTF-8

USER ${CONTAINER_USER}

RUN pip3 install \
      flask \
      pyjwt \
      python-dotenv \
      docopt

# pip install will put the executables under ~/.local/bin
ENV PATH=/home/"${CONTAINER_USER}"/.local/bin:$PATH

WORKDIR /home/${CONTAINER_USER}/workspace

EXPOSE 5000

CMD ["zsh"]

Посмотрите, как запускается из этот скрипт bash :


#!/bin/bash

set -eu

CONTAINER_USER="$(id -u)"

HTTP_PORT=5000


function Create_Docker_Container
{
    local _command="${1:-zsh}"
    local _user="${2? Missing user name or uid for the container we want to stop!!!}"
    local _port="${3? Missing http port for the container we want to stop!!!}"
    local _server_name="${4? Missing server name for the container we want to stop!!!}"
    local _container_name="python-flask-${_user}-${_server_name}-${_port}"

    sudo docker run \
        -it \
        --rm \
        --user "${_user}" \
        --env-file .env \
        --env "FLASK_APP=server/${_server_name}.py" \
        --env "HTTP_PORT=${_port}" \
        --name "${_container_name}" \
        --publish "127.0.0.1:${_port}:5000" \
        --workdir "/home/python/workspace" \
        --volume "$PWD:/home/python/workspace" \
        approov/python-flask ${_command}
}

Create_Docker_Container "flask run -h 0.0.0.0" "${CONTAINER_USER}" "${HTTP_PORT}" "original-server"

Файл .env :

HTTP_PORT=5000
FLASK_APP=server/original-server.py
FLASK_ENV=development
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...