Проблема
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