Docker Compose 不允许使用本地图像

试图从 Docker Hub 提取图像时,以下命令失败:

$ docker-compose up -d
Pulling web-server (web-server:staging)...
ERROR: repository web-server not found: does not exist or no pull access

但是我只想使用一个本地版本的图像,它是存在的:

$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
web-server           staging             b94573990687        7 hours ago         365MB

为什么 Docker 不在本地存储的图像中进行搜索?


这是我的 Docker Compose 文件:

version: '3'
services:
chat-server:
image: chat-server:staging
ports:
- "8110:8110"
web-server:
image: web-server:staging
ports:
- "80:80"
- "443:443"
- "8009:8009"
- "8443:8443"

和我的. env 文件:

DOCKER_HOST=tcp://***.***.**.**:2376
DOCKER_TLS_VERIFY=true
DOCKER_CERT_PATH=/Users/Victor/Documents/Development/projects/.../target/docker
159707 次浏览

在你的码头-作曲。Yml,您可以为本地构建指定 build: .而不是 build: <username>/repo>(而不是从 docker-hub 提取)-我还不能验证这一点,但我相信您 能够为多个服务执行到 docker-compose 文件的相对路径。

services:
app:
build: .

参考资料: https://github.com/gvilarino/docker-workshop

一般来说,这应该像你描述的那样工作。试图重现它,但它只是工作..。

文件夹结构:

.
├── docker-compose.yml
└── Dockerfile

Dockerfile 的内容:

FROM alpine
CMD ["echo", "i am groot"]

构建和标记图像:

docker build -t groot .
docker tag groot:latest groot:staging

与码头-作曲。 yml:

version: '3.1'
services:
groot:
image: groot:staging

并开始码头-作曲:

$ docker-compose up
Creating groot_groot ...
Creating groot_groot_1 ... done
Attaching to groot_groot_1
groot_1  | i am groot
groot_groot_1 exited with code 0

您可能需要更改您的图像标记,以使用斜杠 /分隔两个部分

chat-server:staging

比如:

victor-dombrovsky/chat-server:staging

我认为 Docker 标签背后有一些逻辑,“ one part”标签被解释为来自 DockerHub 的官方图像。

2020年3月9日编辑:

(Docker version 18.09.9-ce build 039a7df, Dockercompose 版本1.24.0,build 0aa59064)

我发现只要创建一个 docker 容器,就可以在使用伪造的本地注册表服务器标记(localhost: 5000/{ image })标记容器之后使用 docker-compose‘ up-d’。

$ docker tag {imagename}:{imagetag} localhost:5000/{imagename}:{imagetag}

您不需要运行本地注册表服务器,但需要使用伪造的本地注册表服务器 url 更改 dockercompose yaml 文件中的映像 url:

version: '3'
services:
web-server:
image: localhost:5000/{your-image-name} #change from {imagename}:{imagetag} to localhost:5000/{imagename}:{imagetag}
ports:
- "80:80"

从{ imagename } : { imagetag }到 localhost: 5000/{ imagename } : { imagetag }

然后向上 D

$ docker-compose -f {yamlfile}.yaml up -d

如果您的本地机器中已经有映像(localhost: 5000/{ imagename }) ,这将创建容器。


加上@Tom Saleeba 的回复,

我在容器上标记“/”后仍然有错误 (例如: victor-dombrovsky/docker-image:latest) 它一直在寻找来自远程 docker.io 服务器的映像。

registry_address/docker-image

似乎“/”之前的 url 是注册表地址,“/”之后的 url 是图像名称。如果没有提供“/”,docker-compose 默认情况下会从远程 docker.io 查找图像。

应该是 已知窃听器码头风格

我最终通过 运行本地注册表使它工作,用 Registry 标记将图像推送到本地注册中心,并从本地注册中心提取图像。

$ docker run -d -p 5000:5000 --restart=always --name registry registry:2
$ docker tag your-image-name:latest localhost:5000/your-image-name
$ docker push localhost:5000/your-image-name

然后更改 dockerfile 中的图像 URL:

version: '3'
services:
chat-server:
image: chat-server:staging
ports:
- "8110:8110"
web-server:
image: localhost:5000/{your-image-name} #####change here
ports:
- "80:80"
- "443:443"
- "8009:8009"
- "8443:8443"

对于聊天服务器映像也是如此。

在我的测试中,为了使其工作,必须指定一个数字标记,否则 docker 将尝试远程检查最新版本。

将您的本地映像重命名为“ web-server: 1”,而不是“ web-server: stage”,并相应地更改您的撰写文件。

对我来说,把 “建造: .”放进去就行了。我的工作码头编写文件看起来像这样,

version: '3.0'
services:
terraform:
build: .
image: tf:staging
env_file: .env
working_dir: /opt
volumes:
- ~/.aws:/.aws

版本 > 1.23(2019年及以后)

最简单的方法是将 image更改为 build:并在相对目录中引用 Dockerfile,如下所示:

version: '3.0'
services:
custom_1:
build:
context: ./my_dir
dockerfile: Dockerfile

这使得 docker-compose可以在一个命令中管理整个构建和映像编排。

# Rebuild all images
docker-compose build
# Run system
docker-compose up

在. env 中有一个 DOCKER _ HOST 条目

从你的. env 文件来看,你似乎已经将 docker-compose配置为使用一个远程的 docker 主机:

DOCKER_HOST=tcp://***.***.**.**:2376

而且,这个。Env 只由 docker-compose加载,而不是 docker。因此在这种情况下,docker images输出并不代表运行 docker-compose时可用的图像。

当运行 docker-compose时,您实际上是在远程主机 tcp://***.***.**.**:2376上运行 Docker,但是当单独运行 docker时,您是在本地运行 Docker。

当您运行 docker images时,您确实会看到一个存储在计算机本地的映像列表。但是 docker-compose up -d将尝试不在本地机器上启动容器,而是在 ***.***.**.**:2376上启动容器。除非你设置了 DOCKER_HOST环境变量,否则 docker images不会显示在远程 Docker 主机上可用的图像,例如:

DOCKER_HOST=tcp://***.***.**.**:2376 docker images

显然,远程 Docker 主机没有存储 web-server:staging映像,Docker 中心上也没有可用的映像。这就是为什么 Docker 抱怨找不到图像。

解决方案

在本地运行容器

如果您的意图是在本地运行容器,那么只需从您的。再试一次。

将映像推送到存储库。

但是,如果计划在给定的 DOCKER _ HOST 上远程运行映像,那么可能应该将其推送到存储库。您可以在 Docker Hub 创建一个免费的存储库,或者您可以在某个地方托管您自己的存储库,然后使用 docker push将映像推送到那里,然后确保您的 Docker-compose。Yml 引用了正确的存储库。

保存图像,远程加载。

如果您不想将映像推送到 Docker Hub 或托管您自己的存储库,您也可以使用 docker image savedocker image load的组合来传输映像:

docker image save web-server:staging | DOCKER_HOST=tcp://***.***.**.**:2376 docker image load

请注意,对于大图像,这可能需要一段时间,特别是在慢速连接上。

你可以使用 拉政策:

image: img:tag
pull_policy: if_not_present