如何编辑Docker镜像?

问题描述 投票:0回答:4

我在社区做了基本的搜索,没有找到合适的答案,所以我在这里提问。抱歉,如果之前问过的话。

基本上,我正在从事某个项目,我们会定期更改代码。所以,我们每次都需要构建docker镜像,因为我们需要从头开始安装requirement.txt中的依赖项,每次大约需要10分钟。

如何对 docker 映像执行直接更改,以及如何配置反映预构建 docker 映像中更改的入口点(在 Docker 文件中)

docker docker-compose dockerfile docker-image
4个回答
15
投票

有4个步骤

  1. 启动要编辑的图像:
    docker run IMAGE
  2. 通过使用
    docker exec -it <container-id>
    脱壳来修改正在运行的镜像(您可以使用
    docker ps
    获取容器 ID)
  3. 进行任何修改(安装新东西,创建目录或文件)
  4. 在新的终端选项卡/窗口中运行
    docker commit <container-id> my-new-image
    (替换为要保存的容器的容器ID)

一个例子

# Run an existing image
docker run -dt existing_image 

# See that it's running
docker ps
# CONTAINER ID   IMAGE            COMMAND   CREATED              STATUS              
# c7e6409a22bf   existing-image   "R"       6 minutes ago        Up 6 minutes

# Shell into it
docker exec -it c7e6409a22bf bash

# Make a new directory for demonstration purposes
# (note that this is inside the existing image)
mkdir NEWDIRECTORY

# Open another terminal tab/window, and save the running container you modified
docker commit c7e6409a22bf my-new-image

# Inspect to ensure it saved correctly
docker image ls
# REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
# existing-image       latest    a7dde5d84fe5   7 minutes ago   888MB
# my-new-image         latest    d57fd15d5a95   2 minutes ago   888MB

2
投票

就我而言,我面临着同样的问题,经过微小的改变,我一次又一次地构建图像。

我的旧 DockerFile

FROM python:3.8.0

WORKDIR /app

# Install system libraries
RUN apt-get update && \
    apt-get install -y git && \
    apt-get install -y gcc

# Install project dependencies
COPY ./requirements.txt .

RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt --use-deprecated=legacy-resolver

# Don't use terminal buffering, print all to stdout / err right away
ENV PYTHONUNBUFFERED 1

COPY . .

所以我所做的,首先像这样创建一个基本图像文件(避免了最后一行,没有复制我的代码)

FROM python:3.8.0

WORKDIR /app

# Install system libraries
RUN apt-get update && \
    apt-get install -y git && \
    apt-get install -y gcc

# Install project dependencies
COPY ./requirements.txt .

RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt --use-deprecated=legacy-resolver

# Don't use terminal buffering, print all to stdout / err right away
ENV PYTHONUNBUFFERED 1

然后使用

构建此图像
docker build -t my_base_img:latest -f base_dockerfile .

然后是最后的Dockerfile

FROM my_base_img:latest 

WORKDIR /app

COPY . .

正如我从这个图像中看到的那样,我无法启动容器,我复制的 python 代码出现问题,因此您可以编辑图像/容器代码,以修复容器中的问题,这样我就避免了以下任务一次又一次地构建图像。

当我的代码得到修复后,我将更改从容器复制到我的代码库,最后,我创建了最终的图像。


1
投票

图像一旦构建就无法编辑。 你总是从一开始就跑

docker build
;它始终在干净的环境中运行。

另一方面,Docker 会缓存构建的镜像。 如果你有图像

01234567
,运行
RUN pip install -r requirements.txt
,并得到图像
2468ace0
,那么下次你运行
docker build
时,它将看到相同的源图像和相同的命令,并跳过执行工作并直接跳转到输出图像。 更改的
COPY
ADD
文件会使以后步骤的缓存失效。

所以标准模式是

FROM node:10 # arbitrary choice of language

WORKDIR /app

# Copy in _only_ the requirements and package lock files
COPY package.json yarn.lock ./
# Install dependencies (once)
RUN yarn install

# Copy in the rest of the application and build it
COPY src/ src/
RUN yarn build

# Standard application metadata
EXPOSE 3000
CMD ["yarn", "start"]

如果您只更改

src
树中的某些内容,
docker build
将跳至
COPY
步骤,因为
package.json
yarn.lock
文件尚未更改。


0
投票

存储库提供的镜像对于创建单个实例类型是唯一的。在许多情况下,用户需要编辑这些图像以满足他们的特定要求。

我们编辑docker镜像来自定义或调整它以满足特定要求。然而,Docker 的一个缺点是无法直接编辑或修改镜像。

编辑 Docker 镜像有 2 种方法:

编辑 Dockerfile

这是 Zabbix 监控容器的 Dockerfile 示例。

zabbix-agent: 
container_name: zabbix-agent 

image: zabbix/zabbix-agent:latest 

net: "host" 

privileged: true 

restart: always 

environment: 

   ZBX_SERVER_HOST: zabbix.mysite.com

要更改现有容器使用的映像,我们必须首先将其删除,然后编辑 Docker 文件进行必要的更改,然后使用新文件重新创建容器。

此示例 Dockerfile 中用于创建容器的映像是“zabbix/zabbix-agent:latest”。通过编辑此文件,您可以将图像更改为不同的图像或版本。

使用单个 YAML Dockerfile,“docker compose”工具可以轻松管理多个 Docker 容器。一次只能更改一个容器,这可以在文件中完成。

更改镜像后只需重新创建相应的容器;其余部分可以保持原样。为此,使用选项“–no-recreate”。

docker-compose -f dockerfile.yml  up -d --no-recreate

这允许我们编辑 Docker 镜像而不会丢失下面的数据。修改 Dockerfile 还可以更轻松地跟踪映像更改。

创建修改后的图像

编辑 Docker 映像的另一种方法是将其作为容器运行,进行必要的更改,然后从修改后的容器创建新映像。

  1. 首先,从存储库中的父映像创建一个 Docker 容器。

  2. 然后,使用 bash shell 连接到容器。

     docker exec -it container-name bash
    
  3. 从 shell 对容器进行必要的更改。安装新包、更改配置文件、下载或删除文件、编译模块等。

  4. 更改完成后退出容器。然后,作为新映像提交容器。这将创建一个具有修改后的容器状态的新映像。

     docker commit container-ID image-name
    

这样你就可以编辑docker镜像了

© www.soinside.com 2019 - 2024. All rights reserved.