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
覆盖,因为您正在挂载覆盖构建结果的主机文件系统。
如果您尝试避免挂载卷,您会发现一切都按预期工作。
我有一个 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
覆盖,因为您正在挂载覆盖构建结果的主机文件系统。
如果您尝试避免挂载卷,您会发现一切都按预期工作。