Сборка контейнера Docker не удалась: / bin / sh: 1: фляга: не найдена

1

Я докментирую приложение Flask. Чтобы запустить приложение без докеров, сначала запустите "export FLASK_APP = app", затем "flask run", поэтому я передал его в файл Docker.

Это сообщение об ошибке после запуска docker-compose -f docker-compose.yml up --build

Не удается запустить сервисное приложение: b'OCI runtime create failed: container_linux.go: 348: запуск процесса контейнера вызвал "exec: \" flask\": исполняемый файл не найден в $ PATH": unknown '

После проверки журналов, набрав docker-compose -f docker-compose.yml logs -f, я вижу эту ошибку, и контейнер выходит из кода 127:

/bin/sh: 1: колба: не найдена

Структура папок

tree
  - app
    - __init__.py
  - Dockerfile
  - docker-compose.yml

докер-compose.yml

version: '2' 

services:
  app:
    restart: always
    build: 
      context: .
      dockerfile: Dockerfile
    ports:
      - "5000:5000"
    volumes:
      - .:/app
    depends_on:
      - redis

  redis:
    image: redis
    command: redis-server
    ports:
      - '6379:6379'

Dockerfile

# Pull base image.
FROM ubuntu

# Install Supervisor.
RUN \
  mkdir /var/log/celery && \
  mkdir /home/ubuntu && \
  apt-get update && \
  apt-get install -y supervisor python-pip wget vim git && \
  rm -rf /var/lib/apt/lists/* && \
  sed -i 's/^\(\[supervisord\]\)$/\1\nnodaemon=true/' /etc/supervisor/supervisord.conf

# needs to be set else Celery gives an error (because docker runs commands inside container as root)
ENV C_FORCE_ROOT=1

# expose port 80 of the container (HTTP port, change to 443 for HTTPS)
EXPOSE 80

# Create virtualenv.
RUN \
  pip2 install --upgrade pip && \
  pip install --upgrade virtualenv && \
  virtualenv -p /usr/bin/python2.7 /home/ubuntu/.virtualenvs

WORKDIR /home/ubuntu/celery-scheduler

ADD requirements.txt /home/ubuntu/tree/

# Install app requirements
RUN \
  . /home/ubuntu/.virtualenvs/bin/activate && \
  pip install -r requirements.txt

COPY . /home/ubuntu/tree

# Copy supervisor configs
RUN \
  cp configs/supervisord.conf /etc/supervisor/supervisord.conf && \
  cp configs/conf.d/*.conf /etc/supervisor/conf.d/

ENV FLASK_APP /home/ubuntu/tree/app/
ENV FLASK_DEBUG 1

CMD ["flask", "run", "--host", "0.0.0.0", "--port", "5000"]

Приложение/__ init__.py

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
import os

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    app.config.from_object('config')
    db.init_app(app)

    with app.app_context():
        db.create_all()
    return app

from app import models
app = create_app()
migrate = Migrate(app, db)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)
  • 0
    Почему с помощью virtualenv в dockerfile? Сам контейнер Docker - это «автономная среда». По вашему вопросу, все примеры dockerfiles, похоже, используют python качестве точки входа, а не флешку. Так что это может решить проблему.
  • 0
    Просто совет: создайте небольшие, одноцелевые (лучше всего: однопроцессные) контейнеры для докеров на Python 3. Нет «ОТ Ubuntu», нет супервизора, нет фоновых задач.
Теги:
docker
flask
docker-compose

1 ответ

0
Лучший ответ

Эта строка здесь:

RUN \
  . /home/ubuntu/.virtualenvs/bin/activate && \
  pip install -r requirements.txt

Будет активирована только ваша виртуальная сеть для этой конкретной команды

Поскольку виртуальная активация действительно только сводится к манипуляции PATH, вы можете сделать это через ENV

Это должно работать:

ENV PATH=/home/ubuntu/.virtualenvs/bin:$PATH
RUN pip install -r requirements.txt

Ещё вопросы

Сообщество Overcoder
Наверх
Меню