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

修改从现有docker映像创建的docker映像,docker,Docker,通过遵循操作指南,我在现有图像的基础上创建了一个新图像。 我没有原始图像的Dockerfile,当容器启动时会发生一些事情 我不能改变——不管怎么说,这就是它的样子 有没有办法修改基本映像Dockerfile中的命令 例如,容器在启动时运行bash脚本,我想对此进行更改。只需在空目录中创建一个新的Dockerfile。使用启动Dockerfile FROM repo/image 其中“repo/image”是您当前使用的映像的id 并在下面添加您的自定义设置 通过这种方式,您可以基于另一个图

通过遵循操作指南,我在现有图像的基础上创建了一个新图像。
我没有原始图像的Dockerfile,当容器启动时会发生一些事情 我不能改变——不管怎么说,这就是它的样子

有没有办法修改基本映像Dockerfile中的命令


例如,容器在启动时运行bash脚本,我想对此进行更改。

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

FROM repo/image 
其中“repo/image”是您当前使用的映像的id

并在下面添加您的自定义设置

通过这种方式,您可以基于另一个图像构建一个新图像


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

如果使用教程中的命令启动容器失败,则基本映像很可能引入了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
选项:

docker run --entrypoint "" -d --name newguest -p 8080:80 mymod/httpd:v1 /usr/sbin/httpd -D FOREGROUND

为了回答您的特定问题:“容器在启动时运行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运行myimage
  • 注:

    • 运行容器(步骤4)时,不再需要指定
      --entrypoint
      ,因为我们在
      Dockerfile
      中默认了它
    • 其实很简单;不需要注册docker hub或任何类似的东西(尽管当然及时推荐;-)

    此过程是否替换了基本图像的dockerfile,还是只是附加了一些内容,这是我在这里遗漏的内容…thx!Dockerfile包含构建映像的说明的代码>以图像
    xxx/yyy
    开始,并进一步对其进行自定义。我认为“替换”或“附加”在这里并不适用。据我理解,
    Dockerfile
    很像
    Makefile
    ,这是一系列用于构建图像的指令。如果您的
    Dockerfile
    包含
    ADD
    COPY
    指令,这些指令指向已包含在基本映像中的文件,则基本文件确实会被“替换”(“分层”可能更准确)。我想我们还需要获得使文件可执行的权限。