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

ste*_*han 3 docker

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

The command bin/sh -c sudo apt-get install git python-yaml python-jinja2 returned a non-zero code: 1
Run Code Online (Sandbox Code Playgroud)

我的问题是我在这里做错什么,甚至可以从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
Run Code Online (Sandbox Code Playgroud)

joh*_*s85 7

几个指针/评论在这里:

  • ubuntuUbuntu
  • 从基本ubuntu(不幸的是,很多图像)中,您不需要使用sudo,默认用户是root(并且在中ubuntusudo无论如何都不包括在内)
  • 你想你的apt-get update,并apt-get installRUN为同一个命令的一部分,以防止问题与码头工人层快取
  • 您需要使用该-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
Run Code Online (Sandbox Code Playgroud)

您可能还会发现阅读Dockerfile最佳实践很有用。

编辑:Larsks的回答也提出了一些关于容器状态的有用点,这些状态在各层之间不持久,因此您也应该对他进行投票!