【问题标题】:Docker - Compose I can't create postgress serverDocker - 撰写我无法创建 postgres 服务器
【发布时间】:2020-03-17 23:55:02
【问题描述】:

您好,我正在尝试创建一个 postgres compose docker pg 管理员 4 和节点

但我遇到了困难,无法创建服务器:

我尝试了所有可能的名字,但我不知道我错了什么:

我的 docker 撰写:

version: "3.7"
services:
  emasa-postgres:
    image: postgres
    environment:
      POSTGRES_PASSWORD: emasa@
      POSTGRES_USER: postgres
      POSTGRES_DB: emasa
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    networks:
      - postgres-compose-network
  web:
    image: emasa-web
    depends_on:
      - emasa-postgres
    ports:
      - "4000:4000"
    networks:
      - postgres-compose-network
  teste-pgadmin-compose:
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: "emasa@hotmail.com"
      PGADMIN_DEFAULT_PASSWORD: "emasa"
    ports:
      - "16543:80"
    depends_on:
      - emasa-postgres
    networks:
      - postgres-compose-network

networks:
  postgres-compose-network:
    driver: bridge

DockerFile

FROM node as builder
WORKDIR usr/app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build


FROM node
WORKDIR usr/app
COPY package*.json ./
RUN npm install --production

COPY --from=builder /usr/app/dist ./dist

COPY ormconfig.docker.json ./ormconfig.json
COPY .env . 

expose 4000
CMD node dist/src/index.js

我的 orm 配置:

{
  "type": "postgres",
  "host": "db",
  "port": 5432,
  "username": "postgres",
  "password": "emasa@",
  "database": "postgres",
  "synchronize": true,
  "logging": false,
  "entities": ["src/entity/**/*.ts"],
  "migrations": ["src/migration/**/*.ts"],
  "subscribers": ["src/subscriber/**/*.ts"],
  "cli": {
    "entitiesDir": "src/entity",
    "migrationsDir": "src/migration",
    "subscribersDir": "src/subscriber"
  }
}

我的 docker-compose 记录器:

Attaching to back-end_web_1, back-end_emasa-postgres_1, back-end_teste-pgadmin-compose_1
emasa-postgres_1         | The files belonging to this database system will be owned by user "postgres".
emasa-postgres_1         | This user must also own the server process.
emasa-postgres_1         |
emasa-postgres_1         | The database cluster will be initialized with locale "en_US.utf8".
emasa-postgres_1         | The default database encoding has accordingly been set to "UTF8".
emasa-postgres_1         | The default text search configuration will be set to "english".
emasa-postgres_1         |
emasa-postgres_1         | Data page checksums are disabled.
emasa-postgres_1         |
emasa-postgres_1         | fixing permissions on existing directory /var/lib/postgresql/data ... ok
emasa-postgres_1         | creating subdirectories ... ok
emasa-postgres_1         | selecting dynamic shared memory implementation ... posix
emasa-postgres_1         | selecting default max_connections ... 20
emasa-postgres_1         | selecting default shared_buffers ... 400kB
emasa-postgres_1         | selecting default time zone ... Etc/UTC
emasa-postgres_1         | creating configuration files ... ok
emasa-postgres_1         | 2020-03-17 23:48:08.890 UTC [81] FATAL:  data directory "/var/lib/postgresql/data" has wrong ownership
emasa-postgres_1         | 2020-03-17 23:48:08.890 UTC [81] HINT:  The server must be started by the user that owns the data directory.
emasa-postgres_1         | child process exited with exit code 1
emasa-postgres_1         | initdb: removing contents of data directory "/var/lib/postgresql/data"
emasa-postgres_1         | running bootstrap script ... web_1                    | Error: getaddrinfo ENOTFOUND db

我的容器 ls:

docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
3a20bcd4f105        emasa-web           "docker-entrypoint.s…"   5 minutes ago       Up 5 minutes        0.0.0.0:4000->4000/tcp           back-end_web_1
b377e650e772        dpage/pgadmin4      "/entrypoint.sh"         14 minutes ago      Up 14 minutes       443/tcp, 0.0.0.0:16543->80/tcp   back-end_teste-pgadmin-compose_1

[![在此处输入图片描述][2]][2]

我真的尝试过使用容器名称:

emasa-postgres_1 emasa-postgres

没有用

【问题讨论】:

  • 出了什么问题;您收到实际的错误消息吗?您能否将代码缩减到演示问题所需的最低限度? docker container ls 通常会写出文本输出,而不是 PNG 文件;你能用命令的实际输出替换图像吗?
  • @David Maze 你好,我在我的 pgadmin4 上收到错误响应,我在我的 postgress 上发布了记录器,看起来很正常,我将替换图像
  • pgadmin 已启动,但您只是遇到连接服务器的问题?
  • @WaLid LamRaoui 是的,我在 pgAdmin 网站上输入,但我无法创建连接
  • 我不知道我的 compose 是否“正确”

标签: node.js docker


【解决方案1】:

问题的原因可以在您提供的日志中看到。

2020-03-17 23:48:08.890 UTC [81] 致命:数据目录“/var/lib/postgresql/data”的所有权错误

您可能正在 Windows 机器上运行 docker?如果是这样,这似乎是一个常见的错误 - check here。所以,你可能想使用一个持久化的 docker 卷,一个 la

services:
  emasa-postgres:
    ...
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
    - postgres-compose-network

volumes:
  pgdata:

我仍然对在 pgadmin 中使用哪个 localhost 有疑问

为了从pgadmin 连接到您的emasa-postgres,您可以为emasa-postgres 容器设置主机名和网络别名,如下所示:

services:
    emasa-postgres:
        hostname: my_super_cool_postgres
        image: postgres
        networks:
            postgres-compose-network:
                aliases:
                    - my_super_cool_postgres

您应该能够通过主机my_super_cool_postgres 连接到数据库,而不是使用localhostdb

这样,您应该能够从 pgadmin 连接到您的 postgres 容器。如果它仍然不适合您,您也可以尝试使用 links 代替,这是 Docker 的旧功能,但应该可以,例如

services:
    teste-pgadmin-compose:
        image: dpage/pgadmin4
        links:
            - "emasa-postgres:my_super_cool_postgres"

这一次,您必须为teste-pgadmin-compose 设置它(或从您需要访问emasa-postgres 容器的任何地方)。然后应该可以访问主机my_super_cool_postgres 和端口5432

【讨论】:

  • 这个好像解决了,log的error msg没了,但是我还是对我的compose在pgadmin中使用哪个localhost有疑问
【解决方案2】:

您的容器是您在docker-compose.yml 中定义的自动DNS 解析的bridge 网络的一部分,并使用postgres-compose-network 至极你定义为一个桥梁

networks:
  postgres-compose-network:
    driver: bridge

试试这个:

  1. 运行 docker network ls 找出在您的 docker 运行时创建的网络所有网络都将在控制台中列出,您会发现 [name]_default 类似于 name-of-project-directory_default 这应该是您的网络。李>
  2. 下一次运行docker network inspect [name]_default检查网络,它会打印出类似这样的内容:

    [
    {
        "Name": "dockerizing_default",
        "Id": "98f8a8ef5153fbe91acc28ed0688179f75e08b321b72aab0abe7bf57e1880cc8",
        "Created": "2020-03-07T14:13:49.446907044+01:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "dockerizing",
            "com.docker.compose.version": "1.25.4"
        }
    }
    ]
    
  3. find IPv4Address ,你应该使用这个 IP 地址而不是 localhost ,它可能是 172.18.0.2 我希望这能解决问题

【讨论】:

  • 我尝试了这个并得到了这个:无法连接到服务器:无法连接到服务器:连接被拒绝服务器是否在主机“172.22.0.3”上运行并接受端口 5432 上的 TCP/IP 连接?
  • 即使使用“bridge”驱动,EXPOSEd 端口仍然映射到主机。 localhost 将始终有效(除非您在 VM 中运行 Docker),但是当使用桥接驱动程序时,端口可能另外可在外部使用
  • 是的,也许这是因为您在docker-compose.yaml 中将数据库设置为POSTGRES_DB: emasa,但您在pgadmin Web 界面上使用postgres,要么更新docker compose 以使用postgres,要么使用emasa 作为db 的名称连接时:如host 172.22.0.3 , password amasa@ , db emasa
【解决方案3】:

不是db,改这个“host”:“db”

到这里

“主机”:“emasa-postgres”

emasa-postgres 是您使用的名称,而不是服务之间连接的 IP 地址

在你的 orm 配置中更改它

【讨论】:

  • 我改变了它,但关于我的 pgadmin 它仍然是相同的连接方式
【解决方案4】:

尝试主机名是127.0.0.1:4532。 还要确保 postgres 容器运行使用 docker ps

更新: 这应该工作

volumes:
      - ./pgdata:/var/lib/postgresql/data/pgdata
ports:
    - "5432:5432"
environment:
    PGDATA: /var/lib/postgresql/data/pgdata

【讨论】:

  • 我试试这个但不工作并尝试 docker ps 并得到:容器 ID 图像命令创建状态端口名称 30fb3ec688dd emasa-web "docker-entrypoint.s..." 大约一分钟前 大约一分钟 0.0 .0.0:4000->4000/tcp back-end_web_1 87bd9318c4c9 dpage/pgadmin4 "/entrypoint.sh" 大约一分钟前 Up 大约一分钟 443/tcp, 0.0.0.0:16543->80/tcp back-end_teste-pgadmin- compose_1
猜你喜欢
  • 1970-01-01
  • 2018-07-23
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 2014-06-04
  • 2021-07-26
相关资源
最近更新 更多