dockerfile RUN echo multiline and with variables



我在Dockerfile中有这样的东西

docker-compose.yml

version: '3.7'
services:   
backuppc-app:
image: tiredofit/backuppc
container_name: backuppc-app
build:
context: .
dockerfile: ./Dockerfile
volumes:
- /mnt/TOSHIBA-BACKUP/backuppc/data:/var/lib/backuppc
- /mnt/TOSHIBA-BACKUP/backuppc/conf/etc/:/etc/backuppc
- /mnt/TOSHIBA-BACKUP/backuppc/conf/home/:/home/backuppc
ports:
- "8081:80"
- "8082:10050"
environment:
- BACKUPPC_UUID=1000
- BACKUPPC_GUID=1000
- SMTP_HOSTNAME=${SMTP_HOSTNAME}
- SMTP_PORT=${SMTP_PORT}
- SMTP_USERNAME=${SMTP_USERNAME}
- SMTP_PASSWORD=${SMTP_PASSWORD}
restart: always

Dockfile

FROM tiredofit/backuppc
RUN echo $'defaults n
auth on n
tls on n
account gmail n
host $SMTP_HOSTNAME n
port $SMTP_PORT n
user $SMTP_USERNAME n
from $SMTP_USERNAME n
password $SMTP_PASSWORD n
account default : gmail n' > /root/.msmtprc

检查到/root/。未评估MSMTPRC变量。做了很多测试…使用${VAR_NAME}不起作用。使用双引号对变量求值,但不使用回车符。

当我尝试将该字符串写入/home/backupc/时。MSMTPRC文件未被覆盖

-rw-r--r--    1 root     backuppc       200 Jan 17 11:19 .msmtprc

为了解决shell在使用双引号时忽略n以及使用单引号不执行变量展开的问题,您可以创建一个变量来保存换行符,并在双引号包围的字符串中展开它。

下面的代码应该可以工作:

RUN nl=$'n' && echo "
foobar $nl
$YOUR_VAR $nl
hello world" > file.txt

在构建图像之后,您应该拥有您希望的带有换行符的文件内容。

加上@blami的评论,你应该把这些变量作为参数传递到你的docker-compose的build部分,并在使用ARG var_name之前在你的Dockerfile中声明它们,就像他发布的链接推荐的那样。

所以最后,你应该有一个类似的Dockerfile:

FROM tiredofit/backuppc
ARG YOUR_VAR
RUN nl=$'n' && echo "
first line $nl
$YOUR_VAR $nl
third line " > file.txt

你可以试着现在运行

> docker build . -t test --build-arg YOUR_VAR="second line"
> docker run test cat file.txt
然后得到像 这样的东西
first line
second line
third line

至于docker-compose,我还没有真正尝试过,但我认为它应该看起来像这样:

version: '3.7'
services:   
backuppc-app:
container_name: backuppc-app
image: tiredofit/backuppc
build:
context: .
dockerfile: ./Dockerfile
args:
- YOUR_VAR=${YOUR_VAR}
...

假设您已经设置了YOUR_VAR环境变量

最新更新