Dockerfile and dpkg command

13

我正在尝试创建一个Dockerfile来安装VuFind。

这是我的Dockerfile:

#Name of container: docker-vufind:3

# Pull base image
FROM ubuntu:16.04
MAINTAINER xxx  "xxx@mail.com"

#Install latest patches
RUN apt-get update && apt-get install -y \
    && apt-get install -y wget 

#Obtain the package
RUN wget http://downloads.sourceforge.net/vufind/vufind_3.1.1.deb?use_mirror=osdn -O vufind_3.1.1.deb

#Install it
RUN dpkg -i vufind_3.1.1.deb

#Install VuFind's dependecies
RUN apt-get install -y -f

我在Ubuntu的bash上运行了这些命令,软件正常工作,但似乎无法通过Dockerfile获得相同的结果,因为由于缺少依赖项,dpkg命令失败了。

The command '/bin/sh -c dpkg -i vufind_3.1.1.deb' returned a non-zero code: 1

在执行 dpkg 命令行之前安装依赖项(如 Apache、jdk、php...)是创建有效的 Dockerfile 的唯一方法吗?还是有更简短的方法?


只是一个快速的提示,您可以忽略wget安装并使用cmd `ADD http:\path\to\file.txt file.txt'。 - Christopher Chase
4个回答

11

虽然不够优雅,但这是一个可行的解决方案:

# continue executing even if command fails
RUN dpkg -i vufind_3.1.1.deb || true

2
最后一行不是多余的吗?也就是说,apt-get install -f 命令会安装之前尝试过的 deb 包。 - Dan M.
1
确实,最后一行不再需要了。第二个命令执行后应该已经解决了所有问题。 - gXg
有没有一种方法可以在运行dpkg -i package.deb时一并安装依赖项,而不必事后运行apt-get install -f,这样做很丑陋和烦人? - Augustin Riedinger
1
@AugustinRiedinger “dpkg” 无法解决依赖关系,因为它只管理软件包,而不是仓库(如“yum”或“apt”)。 - Cristian Todea
我不确定为什么删除了 apt-get install -y -f 这行代码。也许这是针对 VuFind 的某个较新版本的特定问题。我来到这里是为了安装 wkhtmltopdf 的依赖项,因为 dpkg -i ... 提示 dpkg: dependency problems prevent configuration of wkhtmltox: wkhtmltox depends on fontconfig; however: Package fontconfig is not installed... 等等。而 apt-get install -y -f 这行代码则安装了所有依赖项。谢谢! - Tyler Collier

11

在apt版本1.1~exp11(自Ubuntu 16.04可用)中,您可以仅使用apt直接安装.deb文件并解决依赖关系:

apt install ./vufind_3.1.1.deb

小心 ./


谢谢!这太棒了。他们说“apt”除了花哨的加载栏之外没有什么新东西:D - Anas Tiour

2
稍微更加优雅一些。
# Run both commands together
RUN dpkg -i vufind_3.1.1.deb; apt-get install -y -f

0

看起来我找到了一个更干净的替代方案,至少对于我的情况是这样。由于 apt 的 CLI 不稳定(在 Docker 构建期间他们发出了警告),我选择使用包 gdebi-core 来处理 .deb 包及其依赖项:

sudo apt-get install gdebi-core
sudo gdebi /path/to/filename.deb

查看Superuser上的答案以获取更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接