Docker 图像包含 Docker 容器不包含的文件

Docker Image Contains files that Docker Container doesn't

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

如果我运行一个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

这是我的docker文件:

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

在第二个示例中,静态目录从未被创建或构建到。我认为容器是图像的实例。容器怎么会缺少镜像中的文件?

您正在混淆 build-time运行-time,以及 Volumes .

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

如果您尝试避免挂载卷,您会发现一切都按预期工作。