使用 php 构建映像,并使用 docker-compose 在生产中使用它



我从Docker开始,我想我错过了一些很明显的东西。我有一个非常简单的多级Dockerfile,看起来像这样:

FROM php:7.4-fpm-alpine as test_php
WORKDIR /app
COPY . .
CMD ["php-fpm"]
FROM nginx:1.19-alpine as test_nginx
COPY docker/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
WORKDIR /app
COPY --from=test_php /app/public public/

还有一个看起来像这样的码头工人组合:

services:
php:
build:
context: .
target: test_php
volumes:
- ./:/app
nginx:
build:
context: .
target: test_nginx
depends_on:
- php
volumes:
- ./docker/nginx/conf.d:/etc/nginx/conf.d
- ./public:/app/public
ports:
- "80:80"

这在开发中有效(我在公共文件夹中只有一个简单的索引.php使用 phpinfo(( (。 我的 nginx 默认 conf 有这个:

fastcgi_pass php:9000;

与 PHP 服务建立链接。

问题出在生产上。我基于 Dockerfile 构建映像,然后将其推送到 Docker Hub。 为了在生产中使用我的映像,我想在新的docker-compose.prod.yml中做这样的事情:

services:
app:
image:mynickname/myimage

所以我现在使用我在 dockerfile 上创建的映像,但我不再有 php 服务,所以 nginx conf 不再工作。 我想保留我原来的 docker-compose(使用 php 服务(,但在这种情况下,我不使用我的图像...... 我显然错过了一些东西,所以我的问题是:

使用这样的基本配置从开发到产品的"最佳"方法是什么?(PHP和nginx(。 如何在生产中使用我的映像并使 php 正常工作? 还有其他方法吗?

非常感谢您的帮助

第一步(仍在开发环境中(应该是删除覆盖映像中代码的volumes:。 注入每个部署的 nginx 配置是合理的;使用主机内容覆盖COPY的内容意味着您实际上并没有测试要部署的内容。

给定的撰写服务可以同时具有build:image:。 在这种情况下,Compose 将使用你为其指定的名称标记它生成的映像,而不是选择其自己的名称,然后你可以将生成的映像docker-compose push到注册表中。

最后,当您在其他地方运行此设置时,您可以删除build:块,Compose 将拉取所需的image:。 生成的docker-compose.yml大致如下所示:

version: '3'
services:
php:
# build:
#   context: .
#   target: test_php
image: mynickname/php
nginx:
# build:
#   context: .
#   target: test_nginx
image: mynickname/nginx
depends_on:
- php
volumes:
- ./docker/nginx/conf.d:/etc/nginx/conf.d
ports:
- "80:80"

您还可以使用多个docker-compose.yml文件进行设置,其中"标准"docker-compose.yml文件具有生产版本(包括image:(,并使用添加build:声明的docker-compose.override.yml进行扩展。 在生产设置中,您只需要将基本文件复制到目标系统。

最新更新