linux - 在 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 吗?
你可以在上面的语法中看到什么,有什么错误以及如何纠正它?我从昨天开始就卡住了
解决方案
您不能在 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()
函数中还是在包装入口点脚本中。
推荐阅读
- python - 如何在openpyxl中将图像与特定位置和大小对齐
- java - 朋友无法使用我为他创建的应用程序,有没有办法提供使用 exe 运行我的应用程序所需的 java 文件?
- java - 解析 CSV 和编组为 XML 的问题
- php - PHP - 如何将动态生成的复选框的值保存到 DBASE
- java - 检索Oracle长数据类型并将其转换为具有特殊字符的java字符串
- c# - 如何在 GridView 中删除重复数据
- mongodb - 从数组中取消设置值
- gridview - 如何在 Flutter 中建立不同有状态的 Widget 之间的连接
- php - 当我更改具有相同名称的图像时如何更新滑块中的图像
- firebase - 当我从 firebase firestore 流构建小部件时,每次构建它的小部件都算作 firebase 计费的读取?