首页 > 解决方案 > docker compose 环境变量未在 Dockerfile 中设置变量

问题描述

我正在使用 构建我的本地开发应用程序docker-compose.yaml,使用两个Dockerfiles- 一个用于应用程序(WordPress),另一个用于 nginx。由于这是一个使用 Jenkins 管道构建的特定应用程序,因此我无法更改 Dockerfile,但我希望能够在本地进行测试,就像在登台和生产服务器上一样。

php 部分有效,但 nginx 失败。Dockerfilefor 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-admincontainer_nameWordPress 的 php 部分)。

在我的 Jenkins 管道脚本中,这些名称用于手动构建应用程序和静态图像(使用docker build -t DOCKER_IMAGE_NAME_PHP -f Dockerfile.php),然后将名称设置为envlike

echo -e "DOCKER_IMAGE_NAME_PHP=$DOCKER_IMAGE_NAME_PHP" >>env

编辑

就像建议的答案一样,我尝试过argsbuild键下添加

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 脚本中可用......

标签: phpdockernginxdocker-composedockerfile

解决方案


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"]

一个几乎相似的例子位于文档中


推荐阅读