使用 Dockerfile 复制代码或使用 docker-compose 安装卷

约瑟夫·亚当

我正在关注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.ymlCMD

当您设置 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

docker-compose并使用已安装卷的本地映像

如何使用Docker Compose卷安装Windows文件夹?

使用Dockerfile安装Docker

Dockerfile无法复制&Docker-compose卷无法与容器同步

使用 docker-compose 或 dockerfile 挂载目录(无需复制)

使用Docker compose传递Dockerfile的参数

如何使用Compose将Docker卷安装到我的Docker项目中?

在Docker Swarm中使用“绑定”卷安装与docker-compose文件

在带有jenkins的kubernetes实例上使用docker-compose-安装空卷

Docker:除了 docker-compose.yml 之外,如何使用 Dockerfile

使用docker-compose删除命名卷?

docker-compose:对多个服务使用多个Dockerfile

docker-compose build 根据使用次数构建每个 Dockerfile

使用docker-compose创建命名的docker卷?

何时可以使用docker compose提供docker卷?

root 拥有的 Docker 卷目录(不使用 Dockerfile)

从dockerfile访问docker-compose.yml中设置的卷

Docker-Compose卷未递归安装

从主机到容器的Dockerfile COPY工作正常,但是当docker-compose.yml使用卷时,容器中的文件对主机不可见

如何使用Docker Compose安装ElasticSeach插件

如何使用Docker Compose v2使卷永久化

卷上的Docker Compose使用环境变量

如何使用docker-compose创建反向绑定卷?

使用docker-compose删除单个命名卷?

docker-compose将不会使用我的命名卷

在docker compose中使用环境变量作为卷名

使用持久卷启动 postgres 容器 [docker compose]

使用 docker-compose 在卷上保存 mongodb

docker在dockerfile和docker-compose.yml中使用通用配置