【问题标题】:dockerfile RUN echo multiline and with variablesdockerfile RUN echo 多行并带有变量
【发布时间】:2021-01-17 11:21:31
【问题描述】:

我的 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

码头文件

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 文件时,不会被覆盖

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

【问题讨论】:

标签: docker-compose dockerfile


【解决方案1】:

为了反驳 shell 在使用双引号时忽略 \n 并且使用单引号不会执行变量扩展的事实,您可以创建一个变量来保存换行符并将其扩展为双引号包围的字符串。

以下应该有效:

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

构建映像后,您应该拥有带有换行符的文件内容。

添加@blami 的评论,您应该将这些变量作为参数传递到您的docker-compose 中的build 部分并在您的Dockerfile 中声明它们,然后再将它们与ARG var_name 一起使用,就像他发布的链接所推荐的那样。

所以最后,您应该有一个类似于以下内容的 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 环境变量。

【讨论】:

  • @AugustoMurri 我已经更新了我的答案。你试过吗?我从同一个图像和 docker build / docker run 方式开始使用 Dockerfile,但没有尝试完整的案例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2021-04-30
  • 2019-09-26
相关资源
最近更新 更多