使用php构建图像,并使用docker compose将其用于生产

使用php构建图像,并使用docker compose将其用于生产,docker,docker-compose,Docker,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

我从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"
还有一个码头工人,他看起来像这样:

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"
这在开发中起作用(我在公用文件夹中有一个带有phpinfo()的简单index.php)。 nginx的My default.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正常工作? 还有其他方法吗

非常感谢您的帮助

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

给定的组合服务可以同时具有和。在本例中,Compose将使用您指定的名称标记它生成的图像,而不是选择它自己的名称,然后您可以将生成的图像添加到注册表中

最后,当您在其他地方运行此安装程序时,您可以删除
build:
块,Compose将提取所需的
图像:
s。生成的
docker compose.yml
大致如下:

版本:“3”
服务:
php:
#建造:
#上下文:。
#目标:测试php
图片:my昵称/php
nginx:
#建造:
#上下文:。
#目标:test_nginx
图片:my昵称/nginx
取决于:
-php
卷数:
-./docker/nginx/conf.d:/etc/nginx/conf.d
端口:
- "80:80"
您还可以在“standard”
docker compose.yml
文件具有生产版本(包括
图像:
)的位置进行设置,并使用添加
build:
声明的
docker compose.override.yml
对其进行扩展。在生产设置中,您只能将基本文件复制到目标系统。

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

给定的组合服务可以同时具有和。在本例中,Compose将使用您指定的名称标记它生成的图像,而不是选择它自己的名称,然后您可以将生成的图像添加到注册表中

最后,当您在其他地方运行此安装程序时,您可以删除
build:
块,Compose将提取所需的
图像:
s。生成的
docker compose.yml
大致如下:

版本:“3”
服务:
php:
#建造:
#上下文:。
#目标:测试php
图片:my昵称/php
nginx:
#建造:
#上下文:。
#目标:test_nginx
图片:my昵称/nginx
取决于:
-php
卷数:
-./docker/nginx/conf.d:/etc/nginx/conf.d
端口:
- "80:80"

您还可以在“standard”
docker compose.yml
文件具有生产版本(包括
图像:
)的位置进行设置,并使用添加
build:
声明的
docker compose.override.yml
对其进行扩展。在生产设置中,您只需将基本文件复制到目标系统。

您好,非常感谢您的回答、时间和解释。我改变了我的代码,现在它可以工作了:)但由于我只能在Docker Hub中免费使用一个repo,所以我做了一些欺骗,并使用了my昵称/project:nginx和my昵称/project:php,我仍然想知道是否可以只使用一个图像作为输出?我想只使用nginx映像(它比php轻得多,并且集成了php,因为我们在dockerfile中做了一个副本),但是它不起作用(我仍然缺少nginx.conf中的php服务),你知道吗?再次非常感谢你的回答、时间和解释。我改变了我的代码,现在它可以工作了:)但由于我只能在Docker Hub中免费使用一个repo,所以我做了一些欺骗,并使用了my昵称/project:nginx和my昵称/project:php,我仍然想知道是否可以只使用一个图像作为输出?我想只使用nginx映像(它比php轻得多,并且集成了php,因为我们在dockerfile中做了一个副本),但是它不起作用(我仍然缺少nginx.conf中的php服务),你知道吗?再次非常感谢