dockerode 命令式 cli 等价物
dockerode imperative cli equivalent
我正在尝试在我的节点应用程序的 dockerode 容器中编译和执行 java 程序。我可以通过首先使用基本 java 脚本写入 tmp.java
文件然后 运行 执行以下 shell 命令来做到这一点:
docker run --rm -v $PWD:/app -w /app java:8 javac tmp.java
docker run --rm -v $PWD:/app -w /app java:8 java tmp
但是,我现在正尝试过渡到使用 dockerode 模块,并尝试按如下方式复制此功能(基于 dockerode github 上的示例):
docker.run(
'java:8',
['javac', 'tmp.java'],
{
Volumes: {
'/': {}
},
WorkingDir: '/'
},
process.stdout
)
.then(data => {
var output = data[0]
console.log('OUTPUT: ', output)
var container = data[1]
console.log(output.StatusCode)
return container.remove()
})
但是,当我指定 Volumes
和 WorkingDir
选项时,这不会产生任何输出,也不会按预期生成 tmp.class
,当我省略这些选项时,我得到错误: javac: file not found: tmp.java
我认为这意味着我的卷没有正确安装。
本质上,我试图创建一个临时微容器,在容器中编译 & 运行 我的 java 程序,然后销毁容器。因此,我无法在我的主机系统上安装 JDK 并在本地编译程序,并且必须在容器内专门工作。
我目前正在尝试使用命令式 Docker 命令来实现此用例,并且能够使用上面的 cli 命令来完成此操作,但是,我无法使用 dockerode
用于节点(无论是通过命令式命令还是使用 dockerfile)。
非常感谢任何帮助!
问题是你的目录没有映射。
此选项对象等同于选项 --rm -v $PWD:/app -w /app
{
HostConfig: {
AutoRemove: true,
Binds: [
`${process.cwd()}:/app`
]
},
WorkingDir: '/app'
}
AutoRemove: true
是 --rm
Binds: [ `${process.cwd()}:/app` ]
为 -v $PWD:/app
,process.cwd()
为 $PWD
WorkingDir: '/app'
是 -w /app
我还必须更改参数的顺序,因为我得到 TypeError: dest.on is not a function
。 运行 dockerode@3.1.0
我必须将输出流设置为第三个参数,将选项对象设置为第四个参数。
所以完整的命令是这样的:
docker.run(
'java:8',
['javac', 'tmp.java'],
process.stdout,
{
HostConfig: {
AutoRemove: true,
Binds: [
`${process.cwd()}:/app`
]
},
WorkingDir: '/app'
}
)
我正在尝试在我的节点应用程序的 dockerode 容器中编译和执行 java 程序。我可以通过首先使用基本 java 脚本写入 tmp.java
文件然后 运行 执行以下 shell 命令来做到这一点:
docker run --rm -v $PWD:/app -w /app java:8 javac tmp.java
docker run --rm -v $PWD:/app -w /app java:8 java tmp
但是,我现在正尝试过渡到使用 dockerode 模块,并尝试按如下方式复制此功能(基于 dockerode github 上的示例):
docker.run(
'java:8',
['javac', 'tmp.java'],
{
Volumes: {
'/': {}
},
WorkingDir: '/'
},
process.stdout
)
.then(data => {
var output = data[0]
console.log('OUTPUT: ', output)
var container = data[1]
console.log(output.StatusCode)
return container.remove()
})
但是,当我指定 Volumes
和 WorkingDir
选项时,这不会产生任何输出,也不会按预期生成 tmp.class
,当我省略这些选项时,我得到错误: javac: file not found: tmp.java
我认为这意味着我的卷没有正确安装。
本质上,我试图创建一个临时微容器,在容器中编译 & 运行 我的 java 程序,然后销毁容器。因此,我无法在我的主机系统上安装 JDK 并在本地编译程序,并且必须在容器内专门工作。
我目前正在尝试使用命令式 Docker 命令来实现此用例,并且能够使用上面的 cli 命令来完成此操作,但是,我无法使用 dockerode
用于节点(无论是通过命令式命令还是使用 dockerfile)。
非常感谢任何帮助!
问题是你的目录没有映射。
此选项对象等同于选项 --rm -v $PWD:/app -w /app
{
HostConfig: {
AutoRemove: true,
Binds: [
`${process.cwd()}:/app`
]
},
WorkingDir: '/app'
}
AutoRemove: true
是--rm
Binds: [ `${process.cwd()}:/app` ]
为-v $PWD:/app
,process.cwd()
为$PWD
WorkingDir: '/app'
是-w /app
我还必须更改参数的顺序,因为我得到 TypeError: dest.on is not a function
。 运行 dockerode@3.1.0
我必须将输出流设置为第三个参数,将选项对象设置为第四个参数。
所以完整的命令是这样的:
docker.run(
'java:8',
['javac', 'tmp.java'],
process.stdout,
{
HostConfig: {
AutoRemove: true,
Binds: [
`${process.cwd()}:/app`
]
},
WorkingDir: '/app'
}
)