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

所以我试图做一个基本的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 

几个指针/评论在这里:

  • 这是ubuntu而不是Ubuntu
  • 从基地ubuntu (不幸的是,很多图像),你不需要使用sudo ,默认的用户是root (在ubuntusudo不包括在内)
  • 您希望apt-get updateapt-get install作为同一命令的一部分RUN ,以防止Docker的层caching问题
  • 您需要使用-y标志来apt-get install,因为Docker构build过程非交互式运行
  • 在运行这些命令之后,我可以做一些关于清理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最佳实践很有用。

编辑: 拉尔斯克答案也使一些有用的观点关于容器的状态不坚持层之间,所以你应该去养活他呢!

在构build映像时,您已经以root身份运行。 你不需要sudo,很有可能没有安装。

沿着类似的路线,这将永远不会工作:

 RUN sudo cd ansible 

cd命令只影响当前进程; 这将运行cd ,然后退出,留在你开始在同一个目录。dockerWORKDIR指令可以用来持久地改变工作目录:

 WORKDIR ansible 

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

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

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

如果你想在一个容器中运行Ansible,你应该安装它,或者计划从图像启动容器手动运行env-setup脚本。