进入 Docker 容器后如何对其应用更改

3

我已经成功地使用docker exec -i -t 7be21f1544a5 bash进入了一个运行的docker容器。

我对一些JSON文件进行了更改,希望应用这些更改以反映在线状态。

我是一个初学者,尝试过重新启动、挂载等方法都无效。当我使用docker run挂载时,需要替换哪些字符串?

有没有在线示例可供参考?

CONTAINER ID: 7be21f1544a5
IMAGE: gater/web
COMMAND: "/bin/sh -c 'nginx'"
CREATED: 4 weeks ago
STATUS: Up 44 minutes
PORTS: 443/tcp, 172.16.0.1:10010->80/tcp
NAMES: web
3个回答

5

您可以创建一个Dockerfile并运行:

docker build . 

从存放 Dockerfile 的同一目录中运行。

或者您可以运行:

docker run -i -t <docker-image> bash

或者(如果你的容器已经在运行)
docker exec -i -t <container-id> bash

一旦进入shell,您可以自由地进行所有更改。然后运行:

docker commit <container-id> myimage:0.1

您将会有一个本地的新的 Docker 镜像 myimage:0.1。如果您想要推送到 Docker 仓库(DockerHub 或您自己的私有 Docker 仓库),您可以运行以下命令:

docker push myimage:0.1

1
谢谢。然而,我在bash中对正在运行的容器进行了更改,但在线上并没有反映出这些更改。 - mediaroot

2
有两种方法可以做到这一点:
  • Dockerfile方法

您需要知道在进入Docker容器后所做的更改,以及镜像的Dockerfile。

假设您在进入容器后使用yum install命令安装了额外的rpm(yum install perl-HTML-Format),并更新了容器内的某些文件,比如说/opt/test.json(将该文件备份到Docker主机上的某个目录中或存在Dockerfile的目录中)。

您可以将上述命令/步骤放置在Dockerfile中:

RUN  yum install perl-HTML-Format
COPY /docker-host-dir/updated-test.json  /opt/test.json

一旦您更新了Dockerfile,请创建新的镜像并将其推送到Docker仓库。

docker build -t test_image .
docker push test_image:latest

您可以保存更新后的Dockerfile以备将来使用。

  • Docker commit命令方法

在对容器进行更改后,使用以下命令从容器的更改创建新镜像并将其推送到线上。

docker commit container-id test_image
docker push test_image

docker commit --help  
Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

1
谢谢。然而,我在bash中对正在运行的容器进行了更改,但在线上并没有反映出这些更改。 - mediaroot
请描述您所采取的确切步骤以及如何将更改推送到线上? - spectre007

0

你不想这样做。在你弄清楚需要什么之后,你要丢掉正在运行的容器 (git rm 7be21f1544a5),在Dockerfile中重复更改并构建一个新的镜像来运行。


重复Dockerfile中的更改?什么是指令?我看到以下内容:FROM kyma/docker-nginxRUN rm /etc/nginx/sites-enabled/default COPY ./website.conf /etc/nginx/sites-enabled/defaultADD dist/ /var/wwwCMD 'nginx' - mediaroot
是的,你应该重建你的Dockerfile,但有时你确实需要修补正在运行的容器并提交镜像,以至少有一个参考已经完成了什么。确实,这样的镜像可能会有其他意外的更改,不应该用于启动新的容器,但我认为在某些情况下是合理的。此外,生产环境并不是Docker有用的唯一环境。 - jjmontes

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