php - docker compose 环境变量未在 Dockerfile 中设置变量
问题描述
我正在使用 构建我的本地开发应用程序docker-compose.yaml
,使用两个Dockerfiles
- 一个用于应用程序(WordPress),另一个用于 nginx。由于这是一个使用 Jenkins 管道构建的特定应用程序,因此我无法更改 Dockerfile,但我希望能够在本地进行测试,就像在登台和生产服务器上一样。
php 部分有效,但 nginx 失败。Dockerfile
for nginx 看起来像这样:
FROM nginx:latest
COPY scripts/docker-nginx-entrypoint.sh /docker-nginx-entrypoint.sh
COPY ./config/nginx.conf /opt/nginx.conf
COPY ./config/nginx.conf.prd /opt/nginx.conf.prd
COPY --from=DOCKER_IMAGE_NAME_PHP /var/www/html/ /var/www/html/
CMD ["/bin/bash","/docker-nginx-entrypoint.sh"]
该DOCKER_IMAGE_NAME_PHP
部分失败
错误:服务“nginx”构建失败:标志值 DOCKER_IMAGE_NAME_PHP 无效:参考格式无效:存储库名称必须为小写
在我docker-compose.yaml
的 nginx 部分中,我有
nginx:
build:
context: .
dockerfile: Dockerfile.static
container_name: web-service
working_dir: /var/www
volumes:
- .:/var/www
environment:
- "DOCKER_IMAGE_NAME_PHP=app-admin"
- "DOCKER_IMAGE_NAME_NGINX=web-service"
depends_on:
- app
ports:
- 8090:80
我认为environment
在撰写文件中设置就足够了,并且将使用它(这app-admin
是container_name
WordPress 的 php 部分)。
在我的 Jenkins 管道脚本中,这些名称用于手动构建应用程序和静态图像(使用docker build -t DOCKER_IMAGE_NAME_PHP -f Dockerfile.php
),然后将名称设置为env
like
echo -e "DOCKER_IMAGE_NAME_PHP=$DOCKER_IMAGE_NAME_PHP" >>env
编辑
就像建议的答案一样,我尝试过args
在build
键下添加
build:
context: .
dockerfile: Dockerfile.static
args:
- "DOCKER_IMAGE_NAME_PHP=app-admin"
然后在我的Dockerfile
我添加了
FROM nginx:latest
COPY scripts/docker-nginx-entrypoint.sh /docker-nginx-entrypoint.sh
COPY ./config/nginx.conf /opt/nginx.conf
COPY ./config/nginx.conf.prd /opt/nginx.conf.prd
ARG DOCKER_IMAGE_NAME_PHP
COPY --from=$DOCKER_IMAGE_NAME_PHP /var/www/html/ /var/www/html/
CMD ["/bin/bash","/docker-nginx-entrypoint.sh"]
但我仍然得到错误。我试过了${DOCKER_IMAGE_NAME_PHP}
,但这没有帮助。
奇怪的是添加RUN echo $DOCKER_IMAGE_NAME_PHP
,当我运行它时,我可以看到
Step 6/8 : RUN echo $DOCKER_IMAGE_NAME_PHP
---> Running in 0801fcd5b77f
app-admin
但它在COPY
命令中不被识别。怎么来的?
编辑 2
所以事实证明我不能这样做:
https://github.com/moby/moby/issues/34482
因为--from
期望图像名称(我试图从以前的构建服务传递给它,但在我的情况下它是动态的)。这适用于 Jenkins,因为我正在执行docker build
命令,并且变量在 bash 脚本中可用......
解决方案
COPY --from
不支持变量,但支持FROM
。
以下示例使用多阶段构建,以帮助您从第一个图像中提取所需的任何内容。
ARG DOCKER_IMAGE_NAME_PHP=php:7.3
FROM ${DOCKER_IMAGE_NAME_PHP} as php-image
FROM nginx:latest
COPY scripts/docker-nginx-entrypoint.sh /docker-nginx-entrypoint.sh
COPY ./config/nginx.conf /opt/nginx.conf
COPY ./config/nginx.conf.prd /opt/nginx.conf.prd
COPY --from=php-image /var/www/html/ /var/www/html/
CMD ["/bin/bash","/docker-nginx-entrypoint.sh"]
一个几乎相似的例子位于文档中
推荐阅读
- reactjs - 部署后反应路由器dom不起作用
- c# - 如何通过 Unity 中的脚本访问我的 Bird 的 Base Map 组件?
- r - ggplot2 x 轴刻度不可读或不存在
- python - 从存储在 Python 字典中的数据帧创建字典
- python - Python数据框=用另一个数据框的值替换列字符串中的值
- controller - (Odoo) 如何从网站下载 PDF 报告?
- javascript - 如何将css类和Id添加到js变量
- symfony - $entityManager->flush() 不工作 - Symfony
- sql - 如何创建一个计算字段,返回到 FISCAL_QUARTER 结束的剩余天数?
- html - 如果屏幕尺寸是移动尺寸,则用两个点替换 HTML 文本的结尾