- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最后的手段是在这里问。我是 Golang 的新手,我做过简单的程序。
我正在尝试执行以下操作:
使用 golang:
1 - 运行一个容器
2 - 接受输入标准输入到容器
我想用的例子是hashicorp/terraform docker镜像,我想做一个简单的terraform apply
但我需要等待用户输入
下面是我到目前为止工作的代码......任何尝试下面的确切代码的人都需要更新 AWS 环境变量或将 terraform 测试文件更改为另一个提供商......或者只是使用不同的 docker 镜像 ;-)
package main
import (
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/mount"
"github.com/docker/docker/client"
"github.com/docker/docker/pkg/stdcopy"
"golang.org/x/net/context"
"io"
"os"
)
const workingDir = "/home"
func main() {
ctx := context.Background()
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
panic(err)
}
reader, err := cli.ImagePull(ctx, "hashicorp/terraform", types.ImagePullOptions{})
if err != nil {
panic(err)
}
io.Copy(os.Stdout, reader)
fmt.Println(os.Args)
cwd, _ := os.Getwd()
resp, err := cli.ContainerCreate(ctx, &container.Config{
AttachStdin: true,
Tty: false,
StdinOnce: true,
AttachStdout:true,
Cmd: os.Args[1:],
Image: "hashicorp/terraform",
WorkingDir: workingDir,
Env: []string{"AWS_ACCESS_KEY_ID=XXX", "AWS_SECRET_ACCESS_KEY=XXX", "AWS_SESSION_TOKEN=XXX"},
},
&container.HostConfig{
Mounts: []mount.Mount{
mount.Mount{
Type: mount.TypeBind,
Source: cwd,
Target: workingDir,
},
},
},nil, "")
if err != nil {
panic(err)
}
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
statusCh, errCh := cli.ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning)
select {
case err := <-errCh:
if err != nil {
panic(err)
}
case <-statusCh:
}
out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
if err != nil {
panic(err)
}
stdcopy.StdCopy(os.Stdout, os.Stderr, out)
}
provider "aws" {
region = "eu-west-1"
}
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
instance_tenancy = "dedicated"
tags = {
Name = "test-main-vpc"
}
}
./build apply
与 test.tf 在同一目录中
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_vpc.main will be created
+ resource "aws_vpc" "main" {
+ arn = (known after apply)
+ assign_generated_ipv6_cidr_block = false
+ cidr_block = "10.0.0.0/16"
+ default_network_acl_id = (known after apply)
+ default_route_table_id = (known after apply)
+ default_security_group_id = (known after apply)
+ dhcp_options_id = (known after apply)
+ enable_classiclink = (known after apply)
+ enable_classiclink_dns_support = (known after apply)
+ enable_dns_hostnames = (known after apply)
+ enable_dns_support = true
+ id = (known after apply)
+ instance_tenancy = "dedicated"
+ ipv6_association_id = (known after apply)
+ ipv6_cidr_block = (known after apply)
+ main_route_table_id = (known after apply)
+ owner_id = (known after apply)
+ tags = {
+ "Name" = "test-main-vpc"
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
Apply cancelled.
Process finished with exit code 0
package main
import (
"bufio"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/mount"
"github.com/docker/docker/client"
"golang.org/x/net/context"
"io"
"os"
)
const workingDir = "/home"
var inout chan []byte
func main() {
inout = make(chan []byte)
ctx := context.Background()
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
panic(err)
}
reader, err := cli.ImagePull(ctx, "hashicorp/terraform", types.ImagePullOptions{})
if err != nil {
panic(err)
}
go io.Copy(os.Stdout, reader)
//fmt.Println(os.Args)
cwd, _ := os.Getwd()
resp, err := cli.ContainerCreate(ctx, &container.Config{
AttachStderr:true,
AttachStdin: true,
Tty: true,
AttachStdout:true,
OpenStdin: true,
Cmd: os.Args[1:],
Image: "hashicorp/terraform",
WorkingDir: workingDir,
Env: []string{"AWS_ACCESS_KEY_ID=",
"AWS_SECRET_ACCESS_KEY=",
"AWS_SESSION_TOKEN=",
},
},
&container.HostConfig{
Mounts: []mount.Mount{
mount.Mount{
Type: mount.TypeBind,
Source: cwd,
Target: workingDir,
},
},
},nil, "")
if err != nil {
panic(err)
}
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
waiter, err := cli.ContainerAttach(ctx, resp.ID, types.ContainerAttachOptions{
Stderr: true,
Stdout: true,
Stdin: true,
Stream: true,
})
go io.Copy(os.Stdout, waiter.Reader)
go io.Copy(os.Stderr, waiter.Reader)
if err != nil {
panic(err)
}
go func() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
inout <- []byte(scanner.Text())
}
}()
// Write to docker container
go func(w io.WriteCloser) {
for {
data, ok := <-inout
//log.Println("Received to send to docker", string(data))
if !ok {
fmt.Println("!ok")
w.Close()
return
}
w.Write(append(data, '\n'))
}
}(waiter.Conn)
statusCh, errCh := cli.ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning)
select {
case err := <-errCh:
if err != nil {
panic(err)
}
case <-statusCh:
}
}
最佳答案
对您问题的编辑非常有帮助,所以我只想更新对我有用的内容。
我在使用您的 Stdin 解决方案时遇到了问题(与 Scanner 和 waiter.Conn 有关),并采纳了 nicerobot 的建议来使用 io.Copy,它在 Docker 的 cli 源代码中使用。
为了获得终端的感觉(从标准输入、自动完成等中删除回声),我引用了这个线程:https://github.com/fsouza/go-dockerclient/issues/707这基本上是说您必须将 stdin 视为原始终端(后来意识到这也在 Docker 的 cli 源代码中完成)。同样重要的是要注意,您必须尽快恢复终端状态,否则您的其他打印语句可能会不稳定。
最后,我的最终代码看起来像这样......
// ContainerCreate
// ContainerAttach
go io.Copy(os.Stdout, waiter.Reader)
go io.Copy(os.Stderr, waiter.Reader)
go io.Copy(waiter.Conn, os.Stdin)
// ContainerStart
// import("golang.org/x/net/context")
fd := int(os.Stdin.Fd())
var oldState *terminal.State
if terminal.IsTerminal(fd) {
oldState, err = terminal.MakeRaw(fd)
if err != nil {
// print error
}
defer terminal.Restore(fd, oldState)
}
// ContainerWait for exit
terminal.Restore(fd, oldState)
关于docker - 使用 Golang docker SDK - Interactive Container 接受用户输入 os.stdin 到容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58732588/
我刚刚将我的 Ember 插件从 3.0 版升级到了 3.8 版,现在我收到了这个警告: Interaction added to non-interactive element no-invalid
我正在尝试使用git add --interactive有选择地向我的索引添加一些更改,但我不断收到“您编辑的大块不适用。再次编辑...”消息。即使我选择 e 选项,我也会收到此消息,并立即保存/关闭
我正在尝试将 SelectedDateChanged 绑定(bind)到一个命令,这样我就可以将它放在我的 ViewModel 中,但无论如何它都不会接受此代码 http://pastebin.com
有时我的应用程序 UI 中有两个共享按钮(取决于状态)。它们可以共享相同的数据,但位于 UI 的不同部分。我们想要分析从哪个按钮(UI 的一部分)执行了共享。我希望使用 fieldsObject这部分
我发现了一些这样的代码, 1 (require 'cl-lib) 2 (require 'company) 3 4 (defun company-sample-backend (command
背景 gbm 包 的引用手册指出,interact.gbm 函数计算 Friedman 的 H 统计量以评估变量相互作用的强度。 H 统计量的范围为 [0-1]。 dismo 包的引用手册没有引用任何
免责声明:我知道它不是有效的 HTML。我想了解为什么不允许这样做? W3C 建议使用像 button 这样的交互元素。或 a不得包含其他交互元素。 我可以找到很多提到这条规则和一些变通办法的资源,还
在我的网络应用程序中, map 最初设置为非交互式(用户无法在 map 上移动): var map = new mapboxgl.Map({ container: 'map', sty
我正在尝试设置它,以便当我使用 applescript 打开我的插画文件时没有用户交互,但标准是: tell application id "com.adobe.Illustrator" activa
我已经在几个项目中使用了 System.Windows.Interactivity DLL,没有任何问题。现在在我最新的项目中我无法让它工作。我总是收到以下错误: 命名空间“http://schema
Presto 网站(和其他文档)讨论了 Presto 上的“交互式查询”。什么是“交互式查询”?来自 Presto 网站:“Facebook 使用 Presto 对多个内部数据存储进行交互式查询,包括
当我尝试执行 mvn release: Perform 时,出现此错误 [ERROR] Provider message: [ERROR] The svn command failed. [ERROR
我正在尝试使用 C# Interactive 尝试一些 mongodb 驱动程序,但是一旦我尝试创建一个 MongoClient我收到以下异常: > var client = new MongoCli
我想使用IB Api,但无法弄清楚我们如何请求完整的符号列表和信息。 在我找到的文档中:reqScannerParameters()-但不清楚如何获取例如纳斯达克股票的 list ? 有没有更好的办法
我已经开始将 IB 与 IBridgePy 结合使用,我想知道是否有可能以某种方式执行任何回溯测试,有没有人如何做到这一点? 最佳答案 IB 没有现成的回测/重放工具。基本上,您必须下载历史数据并通过
我是否编译 Racket 程序似乎对运行时性能没有影响。 通过编译改进的只是最初加载文件吗?换句话说,是否正在运行 racket src.rkt即时进行 jit 编译,这就是为什么我认为编译与交互式没
在解决一些练习时,我发现了 2 个重复出现的 IO 模式。第一个模式已经被方便的interact覆盖了。第二种模式类似,但按行处理输入。 如何编写 interactLinewise 方法? 最佳答案
我正在尝试使用来自 Fsi 的 F# 程序集,但似乎无法找到一种方法来获取模块中定义的方法列表以便调用它们。 这是我尝试使用的示例文件。在关注 "exposing methods that are c
我正在开发一个基本的 Haskell 程序,其中包含这行代码: interact (unwords . (map pigLatin . words) ) 但是,在将字符串数组传递给我的 pigLati
我不确定我的措辞是否正确。当一个元素被放入放置区时,我需要知道该元素相对于它所在的放置区的 x/y 位置。 非常感谢任何见解。谢谢! 最佳答案 这绝对应该由图书馆提供,但既然不是,我就是这样完成的:
我是一名优秀的程序员,十分优秀!