首页 > 解决方案 > Docker Image 包含 Docker 容器不包含的文件

问题描述

我有一个 Dockerfile,其中包含创建目录并运行输出到该目录的角度构建脚本的步骤。这一切似乎运行正常。但是,当容器运行时,构建的文件和目录不存在。

如果我在图像中运行 shell:

docker run -it pnb_web sh
# cd /code/static
# ls
assets  favicon.ico  index.html  main.js  main.js.map  polyfills.js  polyfills.js.map  runtime.js  runtime.js.map  styles.js  styles.js.map  vendor.js  vendor.js.map

如果我在容器中执行 shell:

docker exec -it ea23c7d30333 sh
# cd /code/static
sh: 1: cd: can't cd to /code/static
# cd /code
# ls
Dockerfile  api  docker-compose.yml  frontend  manage.py  mysite.log  pnb  profiles  requirements.txt  settings.ini  web_variables.env

david@lightning:~/Projects/pnb$ docker container ls
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                                            NAMES
ea23c7d30333        pnb_web                        "python3 manage.py r…"   13 seconds ago      Up 13 seconds       0.0.0.0:8000->8000/tcp                           pnb_web_1_267d3a69ec52

这是我的码头文件:

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
RUN apt install nodejs
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
RUN mkdir /code/static
WORKDIR /code/frontend
RUN npm install -g @angular/cli
RUN npm install
RUN ng build --outputPath=/code/static

和相关的 docker-compose:

version: '3'

services:
  db:
    image: postgres
  web:
    build:
      context: .
      dockerfile: Dockerfile
    working_dir: /code
    env_file:
      - web_variables.env
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

在第二个示例中,从未创建或构建静态目录。我认为容器是图像的一个实例。容器如何从图像中丢失文件?

标签: dockerdocker-composedocker-containerdocker-image

解决方案


您在使用Volumes时混淆了 build-timerun-time

请记住,主机挂载优先于运行容器提供的 FS,因此即使您构建的映像具有资产,它们也会被覆盖,.services.web.volumes因为您正在挂载覆盖构建结果的主机文件系统。

如果您尝试避免安装卷,您会注意到一切都按预期工作。


推荐阅读