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

时间:2018-12-19 21:47:05

标签: docker docker-compose docker-container docker-image

我有一个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

如果我在容器中执行外壳程序:

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

这是我的dockerfile:

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

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

1 个答案:

答案 0 :(得分:2)

您在混淆构建时间运行时间以及玩 Volumes

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

如果您尝试避免卷装入,您会注意到一切正常。