Docker Compose不允许使用本地图像

Vic*_*sky 42 docker 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
Run Code Online (Sandbox Code Playgroud)

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

$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
web-server           staging             b94573990687        7 hours ago         365MB
Run Code Online (Sandbox Code Playgroud)

为什么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"
Run Code Online (Sandbox Code Playgroud)

和我的.env文件:

DOCKER_HOST=tcp://***.***.**.**:2376
DOCKER_TLS_VERIFY=true 
DOCKER_CERT_PATH=/Users/Victor/Documents/Development/projects/.../target/docker
Run Code Online (Sandbox Code Playgroud)

n2o*_*n2o 52

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

文件夹结构:

.
??? docker-compose.yml
??? Dockerfile
Run Code Online (Sandbox Code Playgroud)

Dockerfile的内容:

FROM alpine
CMD ["echo", "i am groot"]
Run Code Online (Sandbox Code Playgroud)

构建和标记图像:

docker build -t groot .
docker tag groot:latest groot:staging
Run Code Online (Sandbox Code Playgroud)

与docker-compose.yml:

version: '3.1'
services:
  groot:
    image: groot:staging
Run Code Online (Sandbox Code Playgroud)

并启动docker-compose:

$ 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
Run Code Online (Sandbox Code Playgroud)


Min*_*hoi 15

2020 年 3 月 9 日编辑:

(docker 版本 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}
Run Code Online (Sandbox Code Playgroud)

您不需要运行本地注册服务器,但需要使用伪造的本地注册服务器 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"
Run Code Online (Sandbox Code Playgroud)

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

然后就 -d

$ docker-compose -f {yamlfile}.yaml up -d 
Run Code Online (Sandbox Code Playgroud)

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


添加到@Tom Saleeba 的回复中,

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

registry_address/docker-image
Run Code Online (Sandbox Code Playgroud)

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

它猜测这是docker-compose的一个已知错误

我终于通过运行本地注册表,使用注册表标签将映像推送到本地注册表,并从本地注册表中提取映像来使其工作。

$ 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
Run Code Online (Sandbox Code Playgroud)

然后更改 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"
Run Code Online (Sandbox Code Playgroud)

聊天服务器图像也是如此。


Sha*_*anu 14

对我来说,“构建:” 成功了。我的工作 docker compose 文件如下所示,

version: '3.0'
services:
  terraform:
    build: .
    image: tf:staging
    env_file: .env
    working_dir: /opt
    volumes:
      - ~/.aws:/.aws
Run Code Online (Sandbox Code Playgroud)


Den*_*soi 12

在您的docker-compose.yml中,您可以指定build: .而不是build: <username>/repo>本地构建(而不是从docker-hub中提取) - 我还无法验证这一点,但我相信您可以为多个服务执行相对路径docker-compose文件.

services:
  app:
    build: .
Run Code Online (Sandbox Code Playgroud)

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

  • 我来自未来,并验证了`build:./app ... build:。/ other-app`可以正常工作 (6认同)
  • 我知道在本地构建图像是可能的,但我认为这不是一个好主意.在我看来,最好分开这里提到的构建和运行步骤:https://12factor.net/build-release-run (3认同)
  • 这是一个很好的观点,我同意 - 这不应该在任何正常情况下使用,但是,我相信与在本地构建然后推送到 docker hub 相比,这是一个快速的步骤(特别是如果您想检查服务是否与另一个) - (2认同)

Ant*_*zzi 12

您可以使用pull_policy

image: img:tag
pull_policy: if_not_present
Run Code Online (Sandbox Code Playgroud)


Ben*_*ing 11

版本 >1.23(2019 及更新版本)

最简单的方法是切换image到相对目录中的build:并引用Dockerfile,如下图:

version: '3.0'
services:
  custom_1:
    build:
      context: ./my_dir
      dockerfile: Dockerfile
Run Code Online (Sandbox Code Playgroud)

这允许docker-compose在单个命令中管理整个构建和映像编排。

# Rebuild all images
docker-compose build
# Run system
docker-compose up
Run Code Online (Sandbox Code Playgroud)


Tom*_*eba 8

您可能需要更改图像标记,以便用斜杠分隔两个部分/.而不是

chat-server:staging
Run Code Online (Sandbox Code Playgroud)

做类似的事情:

victor-dombrovsky/chat-server:staging
Run Code Online (Sandbox Code Playgroud)

我认为Docker标签背后有一些逻辑,"一部分"标签被解释为来自DockerHub的官方图像.


Yog*_*ine 6

您的 .env 中有一个 DOCKER_HOST 条目

从 .env 文件的外观来看,您似乎已配置docker-compose为使用远程 docker 主机:

DOCKER_HOST=tcp://***.***.**.**:2376
Run Code Online (Sandbox Code Playgroud)

此外,此 .env 仅由 加载docker-compose,而不是由 加载docker。因此,在这种情况下,您的docker images输出并不代表运行docker-compose.

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

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

DOCKER_HOST=tcp://***.***.**.**:2376 docker images
Run Code Online (Sandbox Code Playgroud)

显然,远程 Docker 主机没有web-server:staging存储在那里的图像,也没有在 Docker 集线器上可用的图像。这就是 Docker 抱怨找不到镜像的原因。

解决方案

在本地运行容器

如果您打算在本地运行容器,那么只需DOCKER_HOST=...从 .env 中删除该行并重试。

将映像推送到存储库。

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

保存图像,远程加载。

如果你不希望像推到码头工人集线器或主机自己的资源库,您还可以使用组合传输图像docker image savedocker image load

docker image save web-server:staging | DOCKER_HOST=tcp://***.***.**.**:2376 docker image load
Run Code Online (Sandbox Code Playgroud)

请注意,对于大图像,这可能需要一段时间,尤其是在连接速度较慢的情况下。

  • 恕我直言,这是解决实际问题的唯一答案。我不明白为什么它没有更多的选票...... (2认同)