symfony 为什么在Dockerfile中echo“>>”不追加到file .env,而是重写它?如何在dockerfile中使用echo创建多行.env文件?

r7knjye2  于 2023-08-06  发布在  Docker
关注(0)|答案(3)|浏览(160)

我需要用生产或测试环境多行数据填充.env,我尝试将其填充到Dockerfile中,如下所示

CMD echo -e ${ENV_DATABASE_URL} > /var/www/.env
CMD echo -e ${ENV_LOGIN_USER_ID} >> /var/www/.env

字符串
命令cat .env打印输出的将是最后一行${ENV_LOGIN_USER_ID}数据。${ENV_DATABASE_URL}数据将丢失
为什么>> append到.env文件在Dockerfile中不起作用?

lymgl2op

lymgl2op1#

CMD指令在Docker镜像中创建一个新层,并在单独的shell中运行。因此,当您像这样使用多个CMD指令时,它们不会对同一个文件进行操作。
有一种更适合您所要实现的方法,即将echo命令组合到一条RUN指令中并使用shell命令。

ENV ENV_DATABASE_URL='DATABASE_URL="postgresql://postgres:db_password@bot_postrgres:5432/postgres_eis_bot'${LOGIN_USER_ID}'?serverVersion=15&charset=utf8"'
ENV ENV_LOGIN_USER_ID="LOGIN_USER_ID=${LOGIN_USER_ID}"

RUN echo -e "${ENV_DATABASE_URL}\n${ENV_LOGIN_USER_ID}" > /var/www/.env

字符串
或者你可以使用printf命令,它允许你轻松地用换行符格式化字符串:

RUN printf "%s\n%s\n" "${ENV_DATABASE_URL}" "${ENV_LOGIN_USER_ID}" > /var/www/.env

k4aesqcs

k4aesqcs2#

添加到@humza的答案。
我使用这种格式,因为它更容易阅读和扩展:

RUN echo "memory_limit = 128M" > /usr/local/etc/php/conf.d/custom.ini \
 && echo "max_execution_time = 60" >> /usr/local/etc/php/conf.d/custom.ini \
 && echo "error_reporting=E_ALL" >> /usr/local/etc/php/conf.d/custom.ini \
 && echo "log_errors=On" >> /usr/local/etc/php/conf.d/custom.ini \
 && echo "error_log = /proc/self/fd/2" >> /usr/local/etc/php/conf.d/custom.ini

字符串

aiqt4smr

aiqt4smr3#

OP的问题最初包含这个自我回答:
我解决这个问题,也许是更优雅的解决方案?

ARG LOGIN_USER_ID=2
ENV ENV_LOGIN_USER_ID="LOGIN_USER_ID=${LOGIN_USER_ID}\n"
ENV ENV_DATABASE_URL='DATABASE_URL="postgresql://postgres:db_password@bot_postrgres:5432/postgres_eis_bot'${LOGIN_USER_ID}'?serverVersion=15&charset=utf8"\n'
CMD echo -e ${ENV_DATABASE_URL}${ENV_EIS_LOGIN_USER_ID} > /var/www/.env

字符串

相关问题