- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 dockerode
创建一个新的 PostgreSQL docker 容器。我希望能够:
5432
我已经能够使用以下代码在本地主机上创建一个 Docker 容器并公开端口 5432
的工作实现:
docker.createContainer({
Image: "postgres",
Env: [`POSTGRES_PASSWORD=postgres`],
HostConfig: {
PortBindings: {
"5432/tcp": [{ HostPort: "5432" }]
},
},
ExposedPorts: {
"5432/tcp": {}
},
name: "container-name"
})
通过阅读 Docker REST API 文档(以及阅读大量社区帖子),我发现我需要使用 Binds
参数。我将代码更新为以下内容:
docker.createContainer({
Image: "postgres",
Env: [`POSTGRES_PASSWORD=postgres`],
HostConfig: {
PortBindings: {
"5432/tcp": [{ HostPort: "5432" }]
},
// NEW CODE
Binds: [
"/path/on/host/machine:/path/on/container"
],
},
ExposedPorts: {
"5432/tcp": {}
},
name: "container-name"
})
Binds
参数后,我无法再从主机连接到数据库谁能告诉我我做错了什么?我不知道在这个特定的设置中需要什么 Binds
。最终,我不需要将数据库暴露给本地机器,但现在,出于测试目的,我需要能够这样做。提前致谢!
我按照建议使用类似的设置重新测试了这个,这与我已经在做的并没有什么不同。但是,这些建议帮助我走上了正确的道路,并了解了我的错误所在。
问题的发生似乎是因为我试图在我的本地主机上重用一个已经用于不同数据库设置的目录。我认为这是支持的;我猜我缺少什么?
无论哪种情况,我现在都可以正常工作,但我不太明白为什么我不能在我的主机上重用我从命令行启动容器时使用的相同目录。
我没有提到我可以通过从命令行启动容器来让它工作。问题是在尝试使用 dockerode
时 - 但是,我认为这不是 Dockerode 的问题,而是我对 Docker REST API 有一些误解。
我可以对所有数据库使用相同的目录如果我从命令行启动容器,但如果我使用 Docker REST 启动容器则不行API(在我的例子中是 dockerode
)。
我的代码生成的路径似乎有问题。在我稍微经历了一下之后,似乎我只是忽略了那个错误。奇怪的是,当我检查日志时我没有在容器中发现任何错误 - 这就是为什么我不认为路径有任何问题。
因此,对于遇到这种情况的人来说,可能只是需要修复您在主机上引用的路径这一简单问题。
话虽如此,我已经标记了 mchawre 接受的解决方案 - 他的解决方案对于我提出的原始问题是正确的。看来我遇到的其他问题都是由错误引起的。
(我确实希望 Docker 日志在容器启动时会说类似“没有这样的目录”之类的内容 - 这会导致更快的解决方案)
相关信息我在这里找到了以下信息:
Warning: the Docker specific variables will only have an effect if you start the container with a data directory that is empty; any pre-existing database will be left untouched on container startup.
最佳答案
我从头开始尝试了这个,一切正常。请引用以下步骤:
dockerode
npm install dockerode
。机器 ip
和 端口
docker 守护进程暴露在上面。run.js
文件,其中包含使用外部卷运行 postgres 容器的代码。var Docker = require('dockerode');
var dockerHostIP = "192.168.0.33"
var dockerHostPort = 2375
var docker = new Docker({ host: dockerHostIP, port: dockerHostPort });
docker.createContainer({
Image: "postgres",
Env: [`POSTGRES_PASSWORD=postgres`],
HostConfig: {
PortBindings: {
"5432/tcp": [{ HostPort: "5432" }]
},
// NEW CODE
Binds: [
"/root/dir:/tmp"
],
},
ExposedPorts: {
"5432/tcp": {}
},
name: "container-name"
}).then(function(container) {
return container.start();
})
注意: /root/dir
是我主机上的目录,/tmp
是容器内的目录。
node run.js
$ psql postgresql://postgres:postgres@localhost:5432/postgres
psql (11.3)
Type "help" for help.
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
(3 rows)
postgres=#
/root/dir
目录的内容,看它是否已正确挂载。$ ls /root/dir/
test.txt
$
请从你这端尝试并告诉我。
关于node.js - 如何将容器上的端口公开给本地主机并将持久数据绑定(bind)到容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56608465/
我是一名优秀的程序员,十分优秀!