Docker swarm 无法从 Docker 文件正确构建
Docker swarm doesn't build from Dockerfile correctly
我正在使用 docker swarm 和 Docker 版本 19.03.3 引擎。
我的 psql 构建有问题,似乎 Dockerfile 确实 运行 正确并且我确实将新服务推送到注册表,但是当容器启动时我发现所有 COPY 文件缺少并且我在 Docker 文件上安装的 psql 扩展 "Postgis" 未安装。
我没有看到任何错误,这就是为什么我不知道是什么问题。
Docker文件:
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
问题是Docker文件中的这个命令并没有真正构建容器
"RUN apt-get install -y postgis"
如果我转到容器并手动 运行 命令它会工作并且还显示以前从未安装过扩展程序。
这是为什么?
谢谢。
我感觉你在错误的地方输入了 -y
命令。我刚刚构建了这个图像并且构建成功。如果你想要一个特定版本的 postgres 指定它而不是 latest
check here
Docker 文件
FROM postgres:latest
RUN apt-get update -y
RUN apt-get install postgis -y
输出
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
postgis latest eef15fa83f2f 2 minutes ago 645MB
解决方案在“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 和 Docker 版本 19.03.3 引擎。
我的 psql 构建有问题,似乎 Dockerfile 确实 运行 正确并且我确实将新服务推送到注册表,但是当容器启动时我发现所有 COPY 文件缺少并且我在 Docker 文件上安装的 psql 扩展 "Postgis" 未安装。
我没有看到任何错误,这就是为什么我不知道是什么问题。
Docker文件:
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
问题是Docker文件中的这个命令并没有真正构建容器 "RUN apt-get install -y postgis"
如果我转到容器并手动 运行 命令它会工作并且还显示以前从未安装过扩展程序。
这是为什么? 谢谢。
我感觉你在错误的地方输入了 -y
命令。我刚刚构建了这个图像并且构建成功。如果你想要一个特定版本的 postgres 指定它而不是 latest
check here
Docker 文件
FROM postgres:latest
RUN apt-get update -y
RUN apt-get install postgis -y
输出
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
postgis latest eef15fa83f2f 2 minutes ago 645MB
解决方案在“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
出于某种原因,最新的对我来说有问题。