所以我试图创建一个基本的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
答案 0 :(得分:6)
这里有几点指点/评论:
ubuntu
而非Ubuntu
ubuntu
(不幸的是,很多图片)您不需要使用sudo
,默认用户为root
(并且在ubuntu
中,无论如何都不包括sudo
)apt-get update
和apt-get install
为RUN
作为同一命令的一部分,以防止Docker的图层缓存问题-y
标志来apt-get install,因为Docker构建过程以非交互方式运行新的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
脚本。