首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dockerfile RUN echo multiline and with variable

dockerfile RUN echo multiline and with variable
EN

Stack Overflow用户
提问于 2021-01-17 19:21:32
回答 1查看 494关注 0票数 2

我的Dockerfile中有类似这样的内容

docker-compose.yml

代码语言:javascript
复制
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

代码语言:javascript
复制
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/backuppc/.msmtprc文件时,该文件不会被覆盖

代码语言:javascript
复制
-rw-r--r--    1 root     backuppc       200 Jan 17 11:19 .msmtprc
EN

回答 1

Stack Overflow用户

发布于 2021-01-17 20:23:24

为了避免shell在使用双引号时忽略\n,并且使用单引号不会执行变量扩展这一事实,您可以创建一个变量来保存换行符,并将其扩展到由双引号括起来的字符串中。

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

代码语言:javascript
复制
RUN nl=$'\n' && echo "\
foobar $nl\
$YOUR_VAR $nl\
hello world" > file.txt

在构建映像之后,您应该可以按照自己的意愿获得带有换行符的文件内容。

加上@blami的评论,你应该将这些变量作为args传递到你的docker中的build部分--在你的docker文件中使用它们之前在你的docker文件中声明它们,就像他发布的链接推荐的那样。

代码语言:javascript
复制
FROM tiredofit/backuppc

ARG YOUR_VAR

RUN nl=$'\n' && echo "\
first line $nl\
$YOUR_VAR $nl\
third line " > file.txt

你现在可以试着跑了

代码语言:javascript
复制
> docker build . -t test --build-arg YOUR_VAR="second line"
> docker run test cat file.txt

然后得到像这样的东西

代码语言:javascript
复制
first line
second line
third line

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

代码语言:javascript
复制
version: '3.7'
services:   
  backuppc-app:
    container_name: backuppc-app
    image: tiredofit/backuppc
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
         - YOUR_VAR=${YOUR_VAR}
...

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65759973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档