首页 > 解决方案 > 在 alpine dockerfile 中运行 Postgres 失败

问题描述

我正在尝试在 docker 中使用 Alpine 部署我的 Go 应用程序,我能够在我的 Mac 上使用它,然后使用 Centos 8 进行生产遇到问题,这是我的 Dockerfile:

FROM golang:alpine

RUN apk add --no-cache postgresql

RUN apk update && apk add --no-cache gcc && apk add --no-cache libc-dev && apk add --no-cache --update make

# Set the current working Directory inside the container
WORKDIR /app

# Copy go mod and sum files
COPY go.mod go.sum ./

# Download all dependencies. they will be cached of the go.mod and go.sum files are not changed
RUN go mod download

# Copy the source from the current directory to the WORKDIR inisde the container
COPY . .

# Build the Go app
RUN go build .

RUN rm -rf /usr/local/var/postgres/postmaster.pid

// this commands below like "psql -c ;'DROP DATABASE IF EXISTS prod'"
// "psql -c ;'CREATE USER prod'"
RUN make setup

# Exporse port 3000 or 8000 to the outisde world
EXPOSE 3000..

CMD ["make", "run" ]

然后我得到了错误:

psql: error: could not connect to server: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

在我make setup做迁移,创建用户,数据库

也可以在 psql 上为那个 alpine 制作 SUPERUSER 吗?

你可以在上面的语法中看到什么,有什么错误以及如何纠正它?我从昨天开始就卡住了

标签: linuxpostgresqldockercommand-linecentos

解决方案


您不能在 Dockerfile 中运行数据库命令。

以此类推,考虑以下go generate命令:您可以在 Go 源代码中嵌入特殊注释,要求 Go 编译器为您运行程序,通常是生成其他源文件。//go:generate: psql ...在你的源代码中说你并运行go generate ... && go install . 现在你在不同的系统上运行编译的二进制文件。由于您不再指向同一个数据库,因此数据库设置将丢失。

同样,Dockerfile 生成一个编译的工件(在本例中为 Docker 映像),它需要独立于其主机环境运行。在您的示例中,您可以docker push将在 MacOS 上构建的映像存储到注册表中,然后docker run从 CentOS 主机将其从 CentOS 主机上重新构建(这对于生产系统来说可能是更好的做法)。

对于您在问题中显示的特定命令,您可以将它们放在数据库容器的/docker-entrypoint-initdb.d目录中,或者只需在指向您的数据库时运行它们。对于更通用的数据库设置,您可能会考虑在应用程序启动时运行数据库迁移工具,无论是在程序的main()函数中还是在包装入口点脚本中。


推荐阅读