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
相关产品推荐
相关产品推荐

