Docker swarm 无法从 Dockerfile 正确构建

标签 docker dockerfile docker-swarm docker-registry

我使用 docker swarm 和 Docker 版本 19.03.3 引擎。

我的 psql 构建有问题,似乎 Dockerfile 确实运行正确,并且我确实将新服务推送到注册表,但是当容器启动时,我发现所有 COPY 文件都丢失了,并且我在 Dockerfile 上安装的 psql 扩展“Postgis”是未安装。

我没有看到任何错误,这就是为什么我不知道问题出在哪里。

Dockerfile:

FROM postgres
RUN apt-get update -y
RUN apt-get install -y postgis
COPY cluster/ /docker-entrypoint-initdb.d/

群 yml 文件:
        db:
                build: docker-compose.d/postgres
                image: 127.0.0.1:5000/postgres
                restart: 'always'
                environment:
                        - PG_MAX_WAL_SENDERS=8
                        - PG_WAL_KEEP_SEGMENTS=8
                        - PGDATA=/var/lib/postgresql/data/pgdata
                        - POSTGRES_USER=USER
                        - POSTGRES_PASSWORD=password
                volumes:
                        - /db_data:/var/lib/postgresql/data'
                deploy:
                 placement:
                   constraints:
                       - node.role==manager

脚步:
docker service create --name=registry --publish published=5000,target=5000 registry
qhetvgzqj0f8g1t4nxxx76cqz
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged


docker-compose build --no-cache db #if i dont use --no-cache it doesnt rebuild service

Successfully built f6413978c21c
Successfully tagged 127.0.0.1:5000/postgres:latest

docker-compose push db
Pushing db (127.0.0.1:5000/postgres:latest)...
The push refers to repository [127.0.0.1:5000/postgres]
latest: digest: sha256:dccccdbdfxxxxxxxcb1e5b3a8a size: 3877

docker stack deploy base --compose-file docker-compose.swarm.yml

我看到服务正在构建:
docker service ls
lobelr1vzj8l        base_db                replicated          1/1                 127.0.0.1:5000/postgres:latest

容器日志:
docker service ps --no-trunc base_db

ltujcwnx9m2v61hjuqtph6d7s   base_db.1           127.0.0.1:5000/postgres:latest@sha256:dccccdbdfafeb505b7ab349b21f4a580857c3cd51965cd36f81269cb1e5b3a8a   swarm-manager       Ready               Ready 4 seconds ago


docker service logs base_db
    psql:/docker-entrypoint-initdb.d/postgres.sql:1: ERROR:  could not open extension control file "/usr/share/postgresql/12/extension/postgis.control": No such file or directory

问题是容器并没有真正在 Dockerfile 中使用此命令构建
“运行 apt-get install -y postgis”

如果我去容器并手动运行命令它可以工作并且还显示以前从未安装过扩展。

这是为什么?
谢谢。

最佳答案

解决方案在“docker-compose.swarm.yml”服务数据库镜像中发生了变化:
从 :

 image: 127.0.0.1:5000/postgres
到:
 image: 127.0.0.1:5000/postgres:latest
我首先进行了所有这些检查,以确保我的图像已注册到本地注册表:
curl localhost:5000/v2/_catalog
{"repositories":["postgres"]}

localhost:5000/v2/postgres/tags/list
{"name":"postgres","tags":["latest"]}

curl localhost:5000/v2/postgres/manifests/latest

{
   "schemaVersion": 1,
   "name": "postgres",
   "tag": "latest",
   "architecture": "amd64",
   "fsLayers": [
      {
         "blobSum": "sha256:a3ed95caeb02ffe68cdd9fd8440668xxxx0e8a7c22955b46d4"...
所以我认为它可能会被推送为最新的,Dockerfile 中的图像也应该是最新的。
编辑:
我使用的另一个解决方法是更改​​ dockerfile
FROM postgres
FROM postgres:11.5
然后在 yml 文件中:
image: 127.0.0.1:5000/postgres:11.5
出于某种原因,最新的对我来说确实有问题。

关于Docker swarm 无法从 Dockerfile 正确构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58392520/

相关文章:

azure - 如何解决 COPY failed : file not found in build context or excluded in Azure Pipeline?

sqlite - 群集中NFS上的SQLite DB。我会损坏数据吗?

docker - 用 Traefik 重写路径

docker - Dockerfile 中的路径解释

swift 3.1.1.-在 linux copyItem 上发布(atPath :toPath:) is not yet implemented

docker - 用于许多apt-get软件包的高效Dockerfile

docker - 更改 docker compose 中的共享内存大小

docker - Minikube、Kubernetes、Docker Compose、Docker Swarm 等的区别

python - 使用 python 或 bash 自动安装 Docker 和镜像拉取

mongodb - 如何通过docker-compose在docker上创建用户并登录mongodb数据库?