You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dockerfile条件判断失效:为何指定参数后poetry.lock仍被删除?

问题

尝试在docker-compose.yml中设置构建参数,针对特定服务保留poetry.lock文件,但配置未生效,文件始终被删除。

Dockerfile内容

FROM docker.io/python:3.11.4

ARG BASE_DIR=/opt/app
ARG REMOVE_POETRY_LOCK

WORKDIR ${BASE_DIR}
COPY ./pyproject.toml ./poetry.lock ./

RUN if [ $REMOVE_POETRY_LOCK==1 ]; then rm poetry.lock && echo condition_01 >condition_01.txt; else echo "poetry.lock is not removed" > condition_02.txt; fi
RUN echo "REMOVE_POETRY_LOCK: ${REMOVE_POETRY_LOCK}" >REMOVE_POETRY_LOCK_value.txt

docker-compose.yml内容

version: '3'

services:

  min_django_version:
    build:
      context: .
      args:
        - REMOVE_POETRY_LOCK=0
    image: min_django_version:latest
    command: tail -f /dev/null

执行命令及输出

执行命令:

docker compose up -d --build
docker compose exec -it min_django_version bash
ls

输出:

REMOVE_POETRY_LOCK_value.txt  condition_01.txt  pyproject.toml

执行:

cat REMOVE_POETRY_LOCK_value.txt

输出:

REMOVE_POETRY_LOCK: 0

预期REMOVE_POETRY_LOCK值为0时,poetry.lock不会被删除,但实际已被删除,请问原因是什么?应如何修改条件以保留该文件?


原因分析

Shell脚本中,==运算符两边必须添加空格,否则整个表达式会被当作一个非空字符串处理。原命令if [ $REMOVE_POETRY_LOCK==1 ]会被解析为判断字符串0==1(当参数值为0时)是否非空,而任何非空字符串在[ ]条件判断中都会被视为真,因此始终执行then分支,删除poetry.lock。

解决方案

修改Dockerfile中的if条件语句,给==两边加上空格,同时为避免参数未设置时的空值问题,建议给变量包裹双引号:

RUN if [ "$REMOVE_POETRY_LOCK" == "1" ]; then rm poetry.lock && echo condition_01 >condition_01.txt; else echo "poetry.lock is not removed" > condition_02.txt; fi

如果参数确定为数字类型,也可以使用更严谨的数值比较运算符-eq:

RUN if [ "$REMOVE_POETRY_LOCK" -eq 1 ]; then rm poetry.lock && echo condition_01 >condition_01.txt; else echo "poetry.lock is not removed" > condition_02.txt; fi

修改后重新构建镜像,即可根据REMOVE_POETRY_LOCK的参数值正确控制是否删除poetry.lock文件。

内容的提问来源于stack exchange,提问作者K Y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:34:56