我从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
进行扩展。 在生产设置中,您只需要将基本文件复制到目标系统。