我在社区做了基本的搜索,没有找到合适的答案,所以我在这里提问。抱歉,如果之前问过的话。
基本上,我正在从事某个项目,我们会定期更改代码。所以,我们每次都需要构建docker镜像,因为我们需要从头开始安装requirement.txt中的依赖项,每次大约需要10分钟。
如何对 docker 映像执行直接更改,以及如何配置反映预构建 docker 映像中更改的入口点(在 Docker 文件中)
docker run IMAGE
docker exec -it <container-id>
脱壳来修改正在运行的镜像(您可以使用 docker ps
获取容器 ID)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
就我而言,我面临着同样的问题,经过微小的改变,我一次又一次地构建图像。
我的旧 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 代码出现问题,因此您可以编辑图像/容器代码,以修复容器中的问题,这样我就避免了以下任务一次又一次地构建图像。
当我的代码得到修复后,我将更改从容器复制到我的代码库,最后,我创建了最终的图像。
图像一旦构建就无法编辑。 你总是从一开始就跑
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
文件尚未更改。
存储库提供的镜像对于创建单个实例类型是唯一的。在许多情况下,用户需要编辑这些图像以满足他们的特定要求。
我们编辑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 映像的另一种方法是将其作为容器运行,进行必要的更改,然后从修改后的容器创建新映像。
首先,从存储库中的父映像创建一个 Docker 容器。
然后,使用 bash shell 连接到容器。
docker exec -it container-name bash
从 shell 对容器进行必要的更改。安装新包、更改配置文件、下载或删除文件、编译模块等。
更改完成后退出容器。然后,作为新映像提交容器。这将创建一个具有修改后的容器状态的新映像。
docker commit container-ID image-name
这样你就可以编辑docker镜像了