运行Docker时sed命令无法工作

6
我是一名有用的助手,可以翻译文本。
我正在接触Docker。我创建了一个图像,将Debian Jessie解压缩,并希望在APT源文件中添加contrib部分。 /etc/apt/sources.list的内容如下:
$ docker run some/image cat /etc/apt/sources.list
deb http://debian.fastweb.it/debian jessie main
deb http://debian.fastweb.it/debian jessie-updates main
deb http://security.debian.org/ jessie/updates main

我希望它们是:

deb http://debian.fastweb.it/debian jessie main contrib
deb http://debian.fastweb.it/debian jessie-updates main contrib
deb http://security.debian.org/ jessie/updates main contrib

所以我运行了这个命令:

docker run some/image sed -i 's/main/main contrib/g' /etc/apt/sources.list

它可以无错误退出;但它不会更新/etc/apt/sources.list的内容:

$ docker run some/image cat /etc/apt/sources.list
deb http://debian.fastweb.it/debian jessie main
deb http://debian.fastweb.it/debian jessie-updates main
deb http://security.debian.org/ jessie/updates main
1个回答

4
您没有更改图像。您启动了一个基于该镜像的容器。然后,您运行了sed命令并更改了文件内容。检查docker ps -a以查看刚刚关闭的容器的ID。如果您使用docker cp提取文件,则应该看到它按预期更改(假设您的sed命令正确)。
您也可以创建一个Dockerfile。
FROM some/image
RUN sed -i 's/main/main contrib/g' /etc/apt/sources.list
# this command is just temporary, you probably are going to do something else
CMD cat /etc/apt/sources.list

您需要运行新的镜像docker run some/new-image以获得预期的输出。

结论 - 您可能希望在原始镜像的Dockerfile中运行sed命令。


你说得对,如果我检查运行命令的容器的sources.list内容,它们已经更新了。我仍然需要理解镜像和容器之间的区别;你能解释一下如何修改镜像吗?你能建议一个处理这些事情的工作流程吗?(提供相关资源的链接将是很好的 :)) - mdesantis
没问题,如果不行我会想办法的 ;) - mdesantis
1
正确的两个流程为:1)docker run -> docker commit -> docker run;2)您可以从Dockerfile构建镜像,并从镜像运行容器。 - xdays
1
请查看官方Docker文档中的词汇表:http://docs.docker.io/en/latest/terms/image/ - qkrijger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接