【发布时间】:2014-11-24 12:40:24
【问题描述】:
按照操作方法,我基于现有图像创建了一个新图像。
我没有原始图像的 Dockerfile,并且在容器启动时发生了一些事情
我无法改变——反正就是这样。
有没有办法修改基础镜像的Dockerfile中的命令?
例如容器在启动时运行一个 bash 脚本,我想更改它。
【问题讨论】:
标签: docker
按照操作方法,我基于现有图像创建了一个新图像。
我没有原始图像的 Dockerfile,并且在容器启动时发生了一些事情
我无法改变——反正就是这样。
有没有办法修改基础镜像的Dockerfile中的命令?
例如容器在启动时运行一个 bash 脚本,我想更改它。
【问题讨论】:
标签: docker
回答您的具体问题:“容器在启动时运行一个 bash 脚本,我想更改它”。假设您要运行/script.sh(图像的一部分)而不是默认值,您可以使用以下方法实例化容器:
docker run --entrypoint /script.sh repo/image
如果script.sh 不是图像的一部分和/或您不希望每次都像上面那样使用--entrypoint 明确指定它,您可以准备一个包含并运行您自己的script.sh 的图像:
script.sh
使用以下内容创建Dockerfile:
FROM repo/image
ADD script.sh /
ENTRYPOINT /script.sh
docker build -t="myimage" .
docker run myimage注意事项:
--entrypoint,因为我们在 Dockerfile 中设置了默认值。【讨论】:
只需在空目录中创建一个新的 Dockerfile。使用
启动 DockerfileFROM repo/image
“repo/image”是您当前使用的图像的 ID。
并在下方添加您的自定义设置。
这样您可以构建基于另一个图像的新图像。
特别是,要更改启动时运行的命令,请放入 CMD 和/或 ENTRYPOINT 行。
【讨论】:
FROM xxx/yyy 以图像xxx/yyy 开头,并进一步对其进行自定义。我认为“替换”或“附加”在这里并不适用。
Dockerfile 很像Makefile,是一系列构建镜像的指令。如果您的Dockerfile 包含ADD 或COPY 指令,这些指令针对的是已包含在基本映像中的文件,那么基本文件确实会被“替换”(“分层”可能更准确)。
如果使用教程中的命令启动容器失败,则您的基础映像很可能引入了 ENTRYPOINT。您为docker run 指定的任何命令都将作为选项附加到 ENTRYPOINT 命令。因此,给定一个入口点,例如/usr/bin/somescript,
docker run -d --name newguest -p 8080:80 mymod/httpd:v1 /usr/sbin/httpd -D FOREGROUND
将导致容器执行
/usr/bin/somescript /usr/sbin/httpd -D FOREGROUND
而不是
/usr/sbin/httpd -D FOREGROUND
要摆脱 ENTRYPOINT,请使用 --entrypoint 选项:
docker run --entrypoint "" -d --name newguest -p 8080:80 mymod/httpd:v1 /usr/sbin/httpd -D FOREGROUND
【讨论】: