如何通过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
(在ubuntu
,sudo
不包括在内) - 您希望
apt-get update
和apt-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
脚本。