我正在关注Docker 网站上的官方教程
码头文件是
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
码头工人组成是:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
我不明白为什么他们在 Dockerfile 中复制代码COPY . /code/
,然后又将其安装在 docker-compose 中- .:/code
?我复制或挂载还不够吗?
文件中的volumes:
和都是不必要的,应该删除。运行的代码和默认值应包含在 Dockerfile 中。command:
docker-compose.yml
CMD
当您设置 Docker 环境时,想象一下您获得了对全新虚拟机的 root 访问权限,该虚拟机上除了 Docker 之外什么都没有安装。理想的情况是能够docker run your-image
作为单个命令从某个注册表中提取它,并且使用尽可能少的附加选项。当您运行映像时,您不需要单独提供其源代码或要运行的命令,这些通常应该内置到映像中。
在大多数情况下,您应该能够使用很少的选项来构建 Compose 设置。每个服务都需要一个image:
or build:
(如果您打算推送图像,则两者都需要),通常environment:
是 ,ports:
和depends_on:
(注意后一个选项的限制),并且您的数据库容器将需要volumes:
它们的持久状态。通常就是这样。
在 Compose 中确实需要覆盖的一种情况command:
是,如果您需要在同一图像和代码库上运行单独的命令。在 Python 上下文中,这通常会在 Django 应用程序旁边运行 Celery 工作者。
这是一个完整的示例,其中包含一个带有异步工作器的数据库支持的 Web 应用程序。Redis 缓存层没有持久性,除了数据库存储之外,没有任何文件本地存储在任何容器中。缺少的一件事是数据库凭据的设置,这需要额外的environment:
变量。请注意缺少volumes:
for 代码、需要的单个command:
覆盖以及environment:
提供主机名的变量。
version: '3.8'
services:
app:
build: .
ports: ['8000:8000']
environment:
REDIS_HOST: redis
PGHOST: db
worker:
build: .
command: celery worker -A queue -l info
environment:
REDIS_HOST: redis
PGHOST: db
redis:
image: redis:latest
db:
image: postgres:13
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
如果您确实看到volumes:
像这样覆盖图像的代码,通常是为了避免在代码更改时需要重建图像。但是,在您显示的 Dockerfile 中,假设requirements.txt
文件没有更改,重建几乎是免费的。几乎总是可以在 Docker 之外进行日常开发——对于 Python,在虚拟环境中——并使用容器设置进行集成测试和部署,这通常比让你的 IDE 相信该语言更容易它需要的解释器在一个容器中。
有时 Dockerfile 会进行额外的设置(更改行尾或权限,重新排列文件)并且volumes:
挂载会隐藏它。这意味着您实际上从未在开发中运行内置于图像中的代码,因此如果图像设置在某些方面存在错误,您将看不到它。简而言之,它重新引入了 Docker 通常试图避免的“在我的机器上工作”问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句