gpt4 book ai didi

node.js - 从主机在Docker容器上运行命令

转载 作者:行者123 更新时间:2023-12-02 19:50:05 24 4
gpt4 key购买 nike

首先编写代码,解释之后的内容会更容易。

docker-compose.yml

version: '3.4'

services:
db:
user: '${UID}:${GID}'
image: postgres
container_name: postgres
ports:
- '5432:5432'
restart: always
environment:
POSTGRES_HOST: db
POSTGRES_USER: root
POSTGRES_PASSWORD: secret
POSTGRES_DATABASE: foo
PGDATA: /var/lib/postgresql/data/db
volumes:
- ./db/data:/var/lib/postgresql/data/db
- db-init.sh:/docker-entrypoint-initdb.d/:ro

cache:
image: redis:alpine
container_name: redis
sysctls:
net.core.somaxconn: '511'
ports:
- '6379:6379'
command: ['--requirepass "secret"']

api:
image: node:alpine
container_name: api
working_dir: /var/www/app
command: sh -c "npm start"
ports:
- '5000:5000'
volumes:
- node_modules:/var/www/app/node_modules
- .:/var/www/app
env_file: .env
depends_on:
- db
- cache

volumes:
node_modules:
node.js应用程序的 postgres 连接设置:
export const {
POSTGRES_USER = 'root',
POSTGRES_PASSWORD = 'secret',
POSTGRES_HOST = 'db',
POSTGRES_PORT = 5432,
POSTGRES_DATABASE = 'foo',
} = process.env

问题:

将服务或容器名称( dbpostgres)用于 POSTGRES_HOST应用程序的 node设置时:
  • 我可以成功连接并查询数据库。
  • 我无法从主机运行会影响容器的命令。例如,播种db将不起作用:
    npx knex --esm seed:run

  • 这是有道理的,因为docker负责 db / postgres的DNS解析,而这些解析仅在连接容器的网络上有意义。从主机运行命令,针对该容器的命令将失败,因为主机在此处不知道如何解析DNS。

    另一方面,将 localhost用于 POSTGRES_HOST应用程序的 node设置时:
  • postgres中的api的查询将失败。
  • 从主机运行的命令(如npx knex --esm seed:run)将成功。

  • 同样,这是完全合理的。得益于 localhost中的端口转发,可以从主机将容器作为 docker-compose.yml寻址。但是在容器的上下文中,它指的是那个容器:对于 apilocalhost表示自身,并且试图在 localhost:5432api:5432上查找数据库。

    我希望容器间网络正常工作,还希望从主机运行命令,以解决上述容器问题。我知道有两种方法可以实现:
  • 使用容器/服务名称作为POSTGRES_HOST,并使用以下命令对容器运行命令:
    docker exec -it <container_name> <command>
  • 为容器分配静态ip,并使用它们代替服务/容器名称。

  • 我在这里还有其他选择吗?

    最佳答案

    由于要在主机上公开数据库端口,因此可以执行以下操作。

  • 将服务或容器名称(db或postgres)用于POSTGRES_HOST,这样,它将适用于Docker容器。
  • 从主机运行种子命令时,覆盖POSTGRES_HOST。可以通过这种方式完成
  • $ export POSTGRES_HOST=127.0.0.1
    $ npx knex --esm seed:run


    或一步
    $ POSTGRES_HOST=127.0.0.1 npx knex --esm seed:run

    关于node.js - 从主机在Docker容器上运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61231694/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com