【问题标题】:docker compose environment variable not setting the variable inside Dockerfiledocker compose 环境变量未在 Dockerfile 中设置变量
【发布时间】:2019-09-11 03:44:57
【问题描述】:

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

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

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是WordPress的php部分的container_name)。

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

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

编辑

就像建议的答案一样,我尝试在 build 键下添加 args

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

【问题讨论】:

    标签: php docker nginx docker-compose dockerfile


    【解决方案1】:

    为此,您必须在 Dockerfile 中使用 ARG

    https://docs.docker.com/engine/reference/builder/#arg

    在构建时,docker-compose.yml 中的environment 不可用。

    https://docs.docker.com/compose/compose-file/#environment

    您也可以在 docker-compose.yml 中使用 arg:

    https://docs.docker.com/compose/compose-file/#args

    【讨论】:

    • 我在撰写文件的build 键下将其添加为args,并在DockerfileFROM 之后添加了ARG DOCKER_IMAGE_NAME_PHP。当我做RUN echo ${DOCKER_IMAGE_NAME_PHP} 时,我可以看到所需的输出app-admin,但是当我有COPY --from=${DOCKER_IMAGE_NAME_PHP} /var/www/html/ /var/www/html/ 时我仍然得到一个错误(在没有{} 的情况下也尝试过仍然得到相同的结果)。关于我做错了什么的任何线索?
    【解决方案2】:

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

    docs 中有一个几乎相似的例子

    【讨论】:

    • 这似乎正确地提供了图像名称,我认为之前的阶段没有设置,所以我需要更多地研究一下。谢谢!
    • 您的镜像是从您在多阶段 dockerfile 中指定的最后一个基础镜像构建的,在这种情况下 - 仅来自 nginx 镜像。之前的阶段只在那里,所以你可以像我们一样COPY --from他们。谢谢,祝你好运!
    猜你喜欢
    • 2022-11-10
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2020-01-12
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多