启动容器时,我正在使用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
答案 0 :(得分:2)
RUN
您提供的命令正在使用exec语法。请参见documentation on CMD
(对ENTRYPOINT
和CMD
也是如此)
如果您使用
<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