【问题标题】:How to persist 'ln' in Docker with Ubuntu如何使用 Ubuntu 在 Docker 中保留“ln”
【发布时间】:2015-10-24 10:44:17
【问题描述】:

我有一台正在安装 OpenCV 2.4.11 的 Docker 机器

但是,发生了一个错误,我确实找到了解决方案,但这只是暂时的。

当我运行使用 cv2 的 Python 脚本时,会抛出以下错误消息:

Error: libdc1394 error: Failed to initialize libdc1394

我看到这是解决我的问题的唯一线程,但暂时: ctypes error: libdc1394 error: Failed to initialize libdc1394

我在Dockerfile 中添加了以下行,但这并没有影响我的虚拟机。

RUN ln /dev/null /dev/raw1394

但是,如果我在 VM 运行时输入该命令 (docker run -it ...),它确实可以正常工作!但是,这并不能解决我的问题,因为我需要它在启动时正常,如果我重新进入虚拟机,问题又回来了。


我的 Dockerfile:

# Pull base image.
FROM library/ubuntu

MAINTAINER Ivan Seidel <ivanseidel@gmail.com>

RUN apt-get update

#
# Python
#
RUN apt-get install -y python python-dev python-pip python-virtualenv

#
# Node.js and NPM
#
RUN apt-get install -y nodejs nodejs-legacy npm git --no-install-recommends

#
# Install OpenCV
#
RUN apt-get install -y python-opencv --no-install-recommends
RUN ln /dev/null /dev/raw1394

#
# Clear cache
#
RUN rm -rf /var/lib/apt/lists/*

#
# Specific data
# 
EXPOSE 80
COPY . /data
WORKDIR /data
RUN npm install --production

CMD ["bash"]

【问题讨论】:

  • 你知道如何处理这个问题吗?我也遇到过,但是找不到解决办法。

标签: python bash opencv ubuntu docker


【解决方案1】:

好的。我花了一整天的时间。

基本上,/dev/raw1394/dev/null 之间的链接不是永久的。你可以 bash 进入你的虚拟机,调用 ln /dev/null /dev/raw1394,但它只会持续到你重新启动你的容器。

我必须做的,这似乎是最简单但不是完美的方法,就是在容器启动期间放置链接。

我认为将其作为服务运行,但对于一项简单的工作来说似乎太多了。

我最终开始工作的方式,(它不漂亮,但有效)是通过更改 Dockerfile 的 CMD

CMD sh -c 'ln -s /dev/null /dev/raw1394'; &lt;your-script-here&gt;

【讨论】:

    【解决方案2】:

    我在使用 opencv python 容器时遇到了同样的问题。

    我尝试在 ubuntu 的许多文件中添加“ln /dev/null /dev/raw1394”,以便在容器启动时运行它,但都失败了。

    然后我找到 --device for docker run 命令。

    所以我们可以这样使用:

    docker run --device /dev/null:/dev/raw1394 ...
    

    它适用于我的容器。

    其实每次运行时都输入--device /dev/null:/dev/raw1394 是很吵的。但我找不到在 Dockerfile 中设置设备的方法。

    【讨论】:

      【解决方案3】:

      当我将 python 命令从 python2 更改为 python3 时,我遇到了同样的问题。我在 Dockerfile 中的一行:

      RUN ln -sf /usr/bin/python3 /usr/bin/python
      

      每次将新构建的映像作为容器启动时,我都必须手动更改链接。

      我尝试在 Dockerfile 中将命令用作 RUN 的 execform,这解决了我的问题:

      RUN ["ln", "-sf", "/usr/bin/python3", "/usr/bin/python"]
      

      现在,python3 以命令 python 开始,无需手动设置链接。

      【讨论】:

      • 这对我不起作用。我在Dockerfile中改为RUN ["ln", "-s", "/dev/null", "/dev/raw1394"],重建镜像,但是容器启动时不存在链接。
      【解决方案4】:

      我将链接创建添加到我为应用服务所拥有的 docker-compose.yml 文件的 command: 中。它看起来像

      version: '3'
      services:
        thumbor:
          build: .
          ports:
            - 8888:8888
          command: bash -c "ln /dev/null dev/raw1394 && thumbor"
      

      ln 命令仅在 docker-compose up 上运行,而不在 docker-compose run --rm app bash 上运行。

      我从this answer 得到了bash -c

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-17
        • 2018-01-20
        • 1970-01-01
        • 2018-05-29
        • 2016-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多