Команда запуска контейнера Docker не получила переменные .bashrc - PullRequest
0 голосов
/ 23 октября 2018

Я использую docker для выполнения команды при запуске контейнера, но, похоже, переменная окружения не получена из файла .bashrc, пожалуйста, дайте мне несколько советов.спасибо

dockerFile Я добавляю это в .bashrc: echo "export PYTHONPATH=$PYTHONPATH:/models/research:/models/research/slim" >> /root/.bashrc

docker-compose.yml файл с:

command: ["python2", "/usr/bin/supervisord", "--nodaemon", "--configuration", "/etc/supervisor/supervisord.conf"]

PS: еслиЯ выполняю echo $ PYTHPATH или просто выполняю python2 / usr / bin / supervisord -c /etc/supervisor/supervisor.conf из контейнера, там нет проблем.

Система Ubuntu 16.04

конфигурация супервизора:

[program:mosquitto-subscrible]
process_name=%(program_name)s_%(process_num)02d
command=python3 detection.py start_mosquitto_subscrible 
autostart=true
autorestart=true
user=root
numprocs=1
directory=/var/www/html/detection
redirect_stderr=true
stdout_logfile=/var/www/html/detection/logs/detection.log

docker-compose.yml

version: '3'
services:
  tensorflow:
    container_name: object-detection
    build:
    context: ./tensorflow
    dockerfile: Dockerfile
    # environment:
    #   - PYTHONPATH=:/models/research:/models/research/slim
    volumes:
      - ./www:/var/www/html:cached
      - ./tensorflow/supervisor:/etc/supervisor/conf.d
    command: ['tail', '-f', '/dev/null']
    # command: ["python2", "-c", "/usr/bin/supervisord", "--nodaemon","--configuration", "/etc/supervisor/supervisord.conf"]

В заключение я пишу команду в Dockfile echo "export PYTHONPATH=$PYTHONPATH:/models/research:/models/research/slim" >> /root/.bashrc, чтобы PYTHON мог найти / models / research.

там есть модель python /models/research/object_detection.

с моим супервизором, команда python3 detection.py start_mosquitto_subscrible не может найти модель object_detection, если я запускаю supervisord только из команды docker-compose вместоexec внутри контейнера докера.

supervisord для запуска требуется python2, мой код требует python3

Ответы [ 3 ]

0 голосов
/ 30 октября 2018
command: ["python2", "/usr/bin/supervisord", "--nodaemon", "--configuration", "/etc/supervisor/supervisord.conf"]

Введенная вами команда использует синтаксис exec.См. документацию по CMD (то же самое относится к RUN и ENTRYPOINT):

Если вы используете форму оболочки CMD, то<command> будет выполняться в /bin/sh -c:

FROM ubuntu
CMD echo "This is a test." | wc -

Если вы хотите запустить <command> без оболочки, вы должны выразить команду как массив JSON и указать полный путь к исполняемому файлу.Эта форма массива является предпочтительным форматом CMD.Любые дополнительные параметры должны быть индивидуально выражены в виде строк в массиве:

FROM ubuntu
CMD ["/usr/bin/wc","--help"]

В вашем случае вы хотите, чтобы оболочка bash обрабатывала файл .bashrc, а это значит, что вам нужно что-то вроде строкиз:

command: ["/bin/bash", "-c", "python2 /usr/bin/supervisord --nodaemon --configuration /etc/supervisor/supervisord.conf"]

Редактировать: с /root/.bashrc в Ubuntu: 16.04, вы увидите следующее в верхней части файла:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Вы можете изменить файл перед этой строкой с помощью команды sed:

sed -i '4s;^;export PYTHONPATH=$PYTHONPATH:/models/research:/models/research/slim\n;' /root/.bashrc

Я бы посоветовал поместить это в скрипт, используемый для запуска контейнера, вместо взлома .bashrc, например, запуска.sh:

#!/bin/sh
export PYTHONPATH=$PYTHONPATH:/models/research:/models/research/slim
exec python2 /usr/bin/supervisord --nodaemon --configuration /etc/supervisor/supervisord.conf

А затем добавьте это к своему изображению с помощью:

COPY start.sh /
RUN chmod 755 /start.sh # if your build server doesn't have this permission set
CMD [ "/start.sh" ]
0 голосов
/ 01 ноября 2018

~ / .bashrc не будет работать до тех пор, пока оболочка не будет открыта в интерактивном режиме, поэтому не возникает проблем, когда вы делаете docker exec, который является интерактивным, смотрите первые несколько строк файла bashrc:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

вам нужночтобы прокомментировать эти строки.

Если вам нужна только одна переменная окружения, лучше получите значение PYTHON_PATH из вашего контейнера и добавьте полную переменную в файл docker-compose.yml.

0 голосов
/ 23 октября 2018

Попробуйте запустить docker compose с помощью команды:

PYTHONPATH="$PYTHONPATH:/models/research:/models/research/slim" docker-compose up -d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...