如何编辑Docker镜像?

3
我在社区做了基本搜索,没有找到合适的答案,所以我在这里提问。如果此前已有类似问题,请见谅。
我正在处理一个项目,我们需要定期更改代码。因此,每次都需要构建docker镜像,并且需要从头安装requirement.txt中的依赖项,这需要大约10分钟的时间。
如何直接更改docker镜像,并配置entrypoint(在Docker文件中),以反映Pre-Build docker镜像中的更改?
3个回答

3

有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

1

在我的情况下,我也遇到了同样的问题,在进行了一些小的更改之后,我一遍又一遍地构建镜像。

我的旧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时,它将看到相同的源图像和相同的命令,并跳过执行工作,直接跳转到输出图像。更改的COPYADD文件会使缓存无效,以供将来使用。
因此,标准模式如下:
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.jsonyarn.lock文件没有更改。

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