Docker容器启动命令未获取.bashrc变量

时间:2018-10-23 03:34:53

标签: bash docker docker-compose

启动容器时,我正在使用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:如果我执行回显$ 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中编写了一个命令,以使/ models / research可以被PYTHON找到。

有一个Python模型/models/research/object_detection

与我的主管一起,如果仅从docker-compose命令而不是在docker容器中执行python3 detection.py start_mosquitto_subscrible来启动supervisord,则命令newEvent无法找到object_detection模型。

supervisord需要python2来启动,我的代码需要python3

3 个答案:

答案 0 :(得分:2)

RUN

您提供的命令正在使用exec语法。请参见documentation on CMD(对ENTRYPOINTCMD也是如此)

  

如果您使用<command>的shell形式,则/bin/sh -c将执行   在FROM ubuntu CMD echo "This is a test." | wc - 中:

<command>
     

如果要在没有外壳的情况下运行CMD,则必须   将命令表示为JSON数组,并提供指向的完整路径   可执行文件。此数组形式是FROM ubuntu CMD ["/usr/bin/wc","--help"] 的首选格式。任何   其他参数必须在   数组:

.bashrc

在您的情况下,您希望使用bash shell处理command: ["/bin/bash", "-c", "python2 /usr/bin/supervisord --nodaemon --configuration /etc/supervisor/supervisord.conf"] 文件,这意味着您需要执行以下操作:

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

编辑:在ubuntu:16.04中使用/root/.bashrc,您将在文件顶部看到以下内容:

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

您可以使用以下sed命令在此行之前修改文件:

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

我考虑将其放置在用于启动容器的脚本中,而不是修改.bashrc,例如一个start.sh:

COPY start.sh /
RUN chmod 755 /start.sh # if your build server doesn't have this permission set
CMD [ "/start.sh" ]

然后使用以下命令将其添加到您的图像中:

background-position: center;

答案 1 :(得分:1)

〜/ .. bashrc将无法运行,直到以交互方式打开外壳,这就是为什么当您进行交互式的docker exec时没有问题,请参见bashrc文件的前几行:

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

您需要对这些行进行注释。

如果只需要一个Environment变量,最好从容器中获取PYTHON_PATH的值,并将完整的变量添加到docker-compose.yml文件中。

答案 2 :(得分:0)

尝试使用以下命令启动docker compose:

PYTHONPATH="$PYTHONPATH:/models/research:/models/research/slim" docker-compose up -d