docker - 从 docker-compose 构建和使用 docker 镜像

标签 docker docker-compose

我有一个 Dockerfile,它创建了一个包含我的图像需要运行的所有依赖项的图像。然后,我将文件挂载为只读数据卷,并将各种文件设置为入口点。虽然这意味着我不需要有多个 Dockerfile,但出于某种原因,每次我向 docker-compose 文件添加新服务时,我都会创建一个新图像(尽管它看起来只是从缓存中提取)。 有没有办法让 docker-compose 文件构建一次镜像,然后让所有服务都依赖于这个新构建的镜像?

我知道可以单独构建镜像,为其命名,然后让 docker-compose 文件引用该镜像,但这需要 2 个命令而不是单个 docker-compose up我现在使用的。

这是我的 docker images输出看起来像。您可以看到每个服务都在创建自己的镜像,我不喜欢这种情况。我不完全确定这是否意味着每个图像在磁盘上占用了额外的 1.3GB,或者它们是否都只是引用相同的基本图像(我猜是后者,但很想知道),但它仍然会污染 docker 图像列表。

REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
docker_http_server_1   latest              a6eac9198c44        5 weeks ago         1.315 GB
docker_test_client     latest              a6eac9198c44        5 weeks ago         1.315 GB
docker_test_client_3   latest              a6eac9198c44        5 weeks ago         1.315 GB
meh                    latest              a6eac9198c44        5 weeks ago         1.315 GB
docker_data_server_1   latest              a6eac9198c44        5 weeks ago         1.315 GB
docker_server1         latest              a6eac9198c44        5 weeks ago         1.315 GB
docker_server2         latest              a6eac9198c44        5 weeks ago         1.315 GB
docker_server          latest              a6eac9198c44        5 weeks ago         1.315 GB
docker_test_client_2   latest              a6eac9198c44        5 weeks ago         1.315 GB
docker_http_server_2   latest              a6eac9198c44        5 weeks ago         1.315 GB
<none>                 <none>              9428e39bd080        5 weeks ago         431.7 MB
<none>                 <none>              08a27b512ded        5 weeks ago         430.3 MB
<none>                 <none>              acc3e230ecaa        5 weeks ago         411.1 MB
<none>                 <none>              96c74b6e7d9d        5 weeks ago         829.2 MB
<none>                 <none>              acf4a5ef1eeb        5 weeks ago         677 MB
<none>                 <none>              8f646f9a5352        5 weeks ago         2.759 GB
<none>                 <none>              ce8fa0a27cde        5 weeks ago         562.3 MB
<none>                 <none>              533cfe78e0d2        5 weeks ago         165.6 MB
redis                  latest              0d1cbfaa41da        7 weeks ago         185 MB
ubuntu                 16.04               bd3d4369aebc        7 weeks ago         126.6 MB
nginx                  latest              4efb2fcdb1ab        8 weeks ago         183.4 MB
hello-world            latest              c54a2cc56cbb        3 months ago        1.848 kB

当前的 docker-compose 文件:
version: '2'
services:
    data_server_1:
        build: .
        volumes:
            - "..:/buggy:ro"
        entrypoint: "/buggy/buggy_data_server.py"

    http_server_1:
        build: .
        volumes:
            - "..:/buggy:ro"
        entrypoint: "/buggy/buggy_http_server.py"
        links:
            - data_server_1 

    http_server_2:
        build: .
        volumes:
            - "..:/buggy:ro"
        entrypoint: "/buggy/buggy_http_server.py"
        links:
            - data_server_1 

    nginx:
        image: nginx
        ports:
            - "80:80"
            - "443:443"
            - "4242:4242"
        links:
            - data_server_1 
            - http_server_1 
            - http_server_2
        volumes:
            - "../nginx/nginx.conf:/etc/nginx/nginx.conf:ro"
            - "../static:/www/static"
            - "../protos:/www/protos"

    # This is effectively the same as running it on the host machine and host
    # network rather than within the docker network. This is so that we can test
    # to ensure that the tcp listening port works via the public interface
    # rather than through the docker channels.
    test_client:
        build: .
        network_mode: "host"
        volumes:
            - "..:/buggy:ro"
        entrypoint:
            - "/buggy/test_client.py"
            - "--key=/buggy/keys/robot1.key"
            - "--no-gui"
            - "--status"
            - "--buggy-name=Deep Mind (Status)"

    test_client_2:
        build: .
        network_mode: "host"
        volumes:
            - "..:/buggy:ro"
        entrypoint:
            - "/buggy/test_client.py"
            - "--key=/buggy/keys/robot2.key"
            - "--no-gui"
            - "--imu"
            - "--buggy-name=Bender (IMU)"

    test_client_3:
        build: .
        network_mode: "host"
        volumes:
            - "..:/buggy:ro"
        entrypoint:
            - "/buggy/test_client.py"
            - "--key=/buggy/keys/robot3.key"
            - "--no-gui"
            - "--camera"
            - "--buggy-name=Megatron (Camera)"

另外,如果有关于如何改进 docker-compose 文件的任何建议,我很想听听他们的意见,但我相信这是另一个问题。

最佳答案

如果您正在寻找更复杂的构建选项,您可能需要查看 Compose 之外的内容。正如在其他答案中所说,这里有两个问题(1. 构建镜像,2. 运行容器)。 Compose 专注于运行容器。

您可以使用 dobi (免责声明:我是 dobi 的作者)构建您的图像,并启动 Compose。您的 dobi.yaml可能看起来像这样:

image=app:
  image: reponame/appname
  tags: [latest]

compose=dev:
  files: [docker-compose.yml]
  project: '{project}'
  depends: [app]

你可以用 dobi dev 运行构建图像(一次)并启动 Compose(相当于 docker-compose up -d 。要获取交互式日志,您可以运行 dobi dev:attach

您还必须删除 build: .来自您的 docker-compose.yml并将其替换为 image: reponame/appname:latest

关于docker - 从 docker-compose 构建和使用 docker 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40182741/

相关文章:

windows - 无法创建 Windows docker 机器? "Hyper-V PowerShell Module is not available"

运行前 Docker-compose 卷挂载

c# - 在 docker 机器上调试时 MySql 连接被拒绝

使用 phpStorm 进行开发的 Docker 和 SSH

docker - 使用docker-compose将Gitlab CI/CD移植到Digital Ocean以获取多个存储库

mysql - 从本地主机连接到 Docker MySQL 容器?

docker - 在 $PATH 中找不到可执行文件

docker - Docker构成冗余吗?

docker - 如何在 docker compose 中声明 docker 卷存在于外部硬盘驱动器上

php - Docker和php “standard_init_linux.go:207: exec user process caused ” exec格式错误”。入口点也无法读取exec的参数