如何使用apt-get通过Dockerfile安装多个包

时间:2016-10-26 22:24:50

标签: docker

所以我试图创建一个基本的Dockerfile,但是当我运行它时,它说

The command bin/sh -c sudo apt-get install git python-yaml python-jinja2 returned a non-zero code: 1

我的问题是我在这里做错了什么,甚至允许从Dockerfile执行'cd'和'source'等命令?

FROM Ubuntu
MAINTAINER example

#install and source ansible
RUN sudo apt-get update
RUN sudo apt-get install git python-yaml python-jinja2 python-pycurl
RUN sudo git clone https://github.com/ansible/ansible.git
RUN sudo cd ansible
RUN sudo source ./hacking/env-setup

2 个答案:

答案 0 :(得分:6)

这里有几点指点/评论:

  • ubuntu而非Ubuntu
  • 从基座ubuntu(不幸的是,很多图片)您不需要使用sudo,默认用户为root(并且在ubuntu中,无论如何都不包括sudo
  • 您希望apt-get updateapt-get installRUN作为同一命令的一部分,以防止Docker的图层缓存问题
  • 您需要使用-y标志来apt-get install,因为Docker构建过程以非交互方式运行
  • 在运行命令后,我可以做些关于清理apt-cache和其他非必需工件的其他几点,但这应该足以让你继续了

新的Dockerfile(考虑到上述内容)看起来像:

FROM ubuntu
MAINTAINER example

#install and source ansible
RUN apt-get update && apt-get install -y \
    git \
    python-yaml \
    python-jinja2 \
    python-pycurl

RUN git clone https://github.com/ansible/ansible.git
WORKDIR ansible/hacking
RUN chmod +x env-setup; sync \
    && ./env-setup

您可能还会发现阅读Dockerfile best practises

非常有用

编辑:Larsks answer还提供了一些关于容器状态的有用信息,这些信息不会在层之间保持不变,所以你也应该投票给他了!

答案 1 :(得分:2)

构建图片时,您已经以root用户身份运行。你不需要sudo,很有可能没有安装sudo。

沿着类似的方向,这将永远不会起作用:

RUN sudo cd ansible

cd命令仅影响当前进程;这将运行cd然后退出,将您保留在您开始的同一目录中.Docker WORKDIR指令可用于持久更改工作目录:

WORKDIR ansible

您还可以将一系列shell命令传递给RUN指令,如下所示:

RUN cd ansible; source ./hacking/env-setup

但即使 可能也不会做你想做的事,因为像之前的sudo cd ...命令那样会修改你的环境......然后退出,留下当前的任何后续命令中的环境都保持不变。

如果要在容器中运行Ansible,您可能应该安装它,或者计划在从映像启动容器后手动运行env-setup脚本。