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"]
# 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
3条答案
按热度按时间s4chpxco1#
映像一旦生成就不能再编辑了,总是从一开始就运行
docker build
;它总是在干净的环境中运行。另一方面,Docker缓存构建的图像。如果您有图像
01234567
,运行RUN pip install -r requirements.txt
,并得到图像2468ace0
,那么下次运行docker build
时,它将看到相同的源图像和相同的命令,并跳过执行该工作而直接跳到输出图像。更改的COPY
或ADD
文件将该高速缓存在以后的步骤中无效。所以标准模式是
如果你只改变了
src
树中的一些内容,docker build
将跳到COPY
步骤,因为package.json
和yarn.lock
文件没有改变。oogrdqng2#
在我的情况下,我面对同样的,经过微小的变化,我是建立形象一次又一次。
我的旧DockerFile
所以我所做的,首先创建了一个基本图像文件,就像这样(避免了最后一行,没有复制我的代码)
然后使用
然后是最后一个Dockerfile
由于我从这个图像,我不能了容器,问题与我复制的python代码,所以你可以编辑图像/容器代码,以修复容器中的问题,通过这种方式,我避免了建设图像的任务一次又一次.
当我的代码得到修复后,我将更改从容器复制到我的代码库中,最后,我创建了最终的映像。
fcwjkofz3#
共有4个步骤
1.启动要编辑的图像
1.修改正在运行的映像,但使用
docker exec -it <container-id>
对其进行 shell 化(您可以使用docker ps
获取容器id)1.进行任何修改(安装新内容、创建目录或文件)
1.在新的终端选项卡/窗口中运行
docker commit c7e6409a22bf my-new-image
(替换为要保存的容器的容器ID)示例