我编写了一个 erb 模板,用于动态生成 Dockerfile。整个过程如下:
- 从命令行获取输入。
- 根据输入创建一个 ruby 数组。
- 使用 Dockerfile.erb 根据此输入生成 Dockerfile。
我在这里面临的问题是,当输入复制到生成的 Dockerfile 时,它周围有引号,我需要避免。有没有办法做到这一点?
Dockerfile.erb
FROM docker.cernerrepos.net/alpine:3.7 AS builder
LABEL bundles=<%= keys[:bundles] %>
生成.rb
require 'optparse'
require 'erb'
DEBUG_PREFIX = '>>> generate_dockerfile.rb ->'
@options = {}
@options[:output]= '.'
optparse = OptionParser.new do |opts|
opts.banner = 'Usage: generate_dockerfile.rb [options]'
opts.on('-b [BUNDLES]', '--bundles [BUNDLES]', "Comma separated list of bundles without extension and version.") do |bundles|
@options[:bundles] = bundles.split(',')
end
opts.on('-h', '--help', 'Display this Help') do
puts opts
exit
end
end
optparse.parse!
keys = @options
File.open('Dockerfile', 'w+') do |f|
f.write(ERB.new(File.read('Dockerfile.erb'), nil, '-').result(binding))
end
实际输出 Dockerfile
FROM docker.cernerrepos.net/alpine:3.7 AS builder
LABEL bundles=["sample_bundle1", "sample_bundle2"]
预期输出 Dockerfile
FROM docker.cernerrepos.net/alpine:3.7 AS builder
LABEL bundles=[sample_bundle1, sample_bundle2]
执行命令
ruby generate.rb -b sample_bundle1,sample_bundle2
编辑1:修改问题以包括最少的示例代码、预期输出和实际输出以及运行代码的命令。
最佳答案
就在这里:
LABEL bundles=<%= keys[:bundles] %>
您基本上是在调用 keys[:bundle].to_s
并将其插入结果中。
["foo", "bar"].to_s
是什么?它是 ["foo", "bar"]
(带引号!)
这就是您得到此结果的原因。
如果您想删除引号,可以将其更改为以下内容:
LABEL bundles=[<%= keys[:bundles].join(", ") %>]
并不是说这是错误的方法,但这并不是典型的做法,所以我认为没有其他内置方法可以做到这一点。
关于ruby - 如何避免使用 erb 模板中的引号生成内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62921058/