如何修改从现有映像创建的docker映像

时间:2014-11-24 12:40:25

标签: docker

基于howto,我基于现有图像创建了一个新图像 现在我没有Dockerfile,当容器启动时会发生一些事情 我无法改变 - 这就是它对我的看法。

有没有办法修改我使用的基本映像的Dockerfile中设置的内容?

例如:容器在启动时运行bash脚本,我想更改它。

3 个答案:

答案 0 :(得分:23)

要回答您的特定q:" 容器在启动时运行bash脚本,我想更改此"。假设您要运行/script.sh(图像的一部分)而不是默认值,您可以使用以下方法实例化容器:

docker run --entrypoint /script.sh repo/image

如果script.sh不是图片的一部分和/或您不希望每次都使用--entrypoint明确指定,则可以准备包含并运行您的图片拥有script.sh

  1. 创建一个空目录并在其中复制或创建script.sh
  2. 使用以下内容创建Dockerfile

    FROM repo/image
    ADD script.sh /
    ENTRYPOINT /script.sh
    
  3. docker build -t="myimage" .

  4. docker run myimage
  5. 注意:

    • 运行容器时(步骤4),不再需要指定--entrypoint,因为我们在Dockerfile中默认了它。
    • 真的那么简单;无需注册码头中心或任何此类事物(虽然它当然是及时推荐的; - )

答案 1 :(得分:3)

如果使用教程中的命令启动容器失败,则基本映像很可能引入了ENTRYPOINT。您为docker run指定的任何命令都将作为选项附加到ENTRYPOINT命令。因此,给出例如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

答案 2 :(得分:2)

只需在空目录中创建一个新的Dockerfile。使用

启动Dockerfile
FROM repo/image 

其中' repo / image'是您当前使用的图像的ID。

并在下面添加您的自定义。

这样您就可以构建基于另一个图像的新图像。

特别是,要更改启动时运行的命令,请输入CMD和/或ENTRYPOINT行。