当您有一个用于数据库的Dockerfile、一个用于应用程序服务器的Dockerfile等时,如何组织属于项目的Dockerfile ?您是否在源代码中创建了某种层次结构? 一个大的企业项目不能只包含一个Dockerfile?
作者的注意
这个答案已经过时了。图不再存在,已被Docker合成所取代。 接受的答案不能被删除。
Docker Compose支持项目层次结构的构建。所以现在很容易在每个子目录中支持Dockerfile。
├── docker-compose.yml
├── project1
│ └── Dockerfile
└── project2
└── Dockerfile
原来的答案
我只是为每个组件创建了一个包含Dockerfile的目录。例子:
设置docker / fig Mesos环境
当构建容器时,只要给出目录名,Docker就会选择正确的Dockerfile。
在较新版本(>=1.8.0)的docker中,您可以这样做
docker build -f Dockerfile.db .
docker build -f Dockerfile.web .
大省。
编辑:更新版本每raksja的评论
编辑:来自@vsevolod的评论:可以通过给文件. dockerfile扩展名(而不是名称)来在VS代码中获得语法高亮显示,例如Prod.Dockerfile, Test。Dockerfile等等。
当处理一个需要使用多个dockerfile的项目时,只需在一个单独的目录中创建每个dockerfile。例如,
。.app/ 。.db/
上面的每个目录都包含它们的dockerfile。当应用程序正在构建时,docker将搜索所有目录并构建所有dockerfile。
在不同的目录中使用docker-compose和多个Dockerfile
不要将Dockerfile重命名为Dockerfile.db或Dockerfile。web,它可能不被你的IDE支持,你将失去语法高亮显示。
正如Kingsley Uchnor所说,您可以有多个Dockerfile,每个目录一个,它们代表您想要构建的内容。
我喜欢用docker文件夹保存每个应用程序及其配置。下面是一个有数据库的web应用程序的项目文件夹层次结构示例。
docker-compose.yml
docker
├── web
│ └── Dockerfile
└── db
└── Dockerfile
docker-compose。yml例子:
version: '3'
services:
web:
# will build ./docker/web/Dockerfile
build: ./docker/web
ports:
- "5000:5000"
volumes:
- .:/code
db:
# will build ./docker/db/Dockerfile
build: ./docker/db
ports:
- "3306:3306"
redis:
# will use docker hub's redis prebuilt image from here:
# https://hub.docker.com/_/redis/
image: "redis:alpine"
Docker-compose命令行用法示例:
# The following command will create and start all containers in the background
# using docker-compose.yml from current directory
docker-compose up -d
# get help
docker-compose --help
如果你需要父文件夹中的文件作为Dockerfile构建上下文的一部分
你仍然可以使用上面的解决方案,并将Dockerfile放置在docker/web/Dockerfile目录下,你所需要的只是在docker-compose中设置构建上下文。你是这样说的:
version: '3'
services:
web:
build:
context: .
dockerfile: ./docker/web/Dockerfile
ports:
- "5000:5000"
volumes:
- .:/code
文件层次结构是这样的:
config-on-root.ini
docker-compose.yml
docker
└── web
├── Dockerfile
└── some-other-config.ini
./docker/web/Dockerfile可以从上下文中访问所需的文件,如下所示:
FROM alpine:latest
COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /
还要注意,构建上下文将包含指定目录下的所有文件。确保使用.dockerignore文件来防止加载不需要的大文件或目录,以节省构建过程中的时间。
下面是来自tldr docker-compose的一些快速命令。确保你参考了官方文件以获得更多细节。
添加一个抽象层,例如,在这个项目https://github.com/larytet/dockerfile-generator中添加一个YAML文件,看起来像
centos7:
base: centos:centos7
packager: rpm
install:
- $build_essential_centos
- rpm-build
run:
- $get_release
env:
- $environment_vars
一个简短的Python脚本/make可以从配置文件生成所有dockerfile。
推荐文章
- 如何从DockerFile运行docker实例?
- 我是否试图连接到启用TLS的没有TLS的守护进程?
- Docker -一种访问主机USB或串行设备的方法?
- Docker:无效引用格式
- 将AWS凭证传递给Docker容器的最佳方法是什么?
- 如何在docker-compose中设置主机名?
- 为什么Docker容器映像这么大?
- 如何在docker撰写版本3中指定内存和CPU限制
- Docker和安全密码
- 如何让Docker容器在系统引导时自动启动?
- 如何在Docker容器中用模式初始化MySQL数据库?
- PYTHONUNBUFFERED在docker文件中的用途是什么?
- 如何在Dockerfile CMD中使用变量?
- 将主机端口转发到docker容器
- “docker compose”与“docker-compose”的区别