如何将对docker-compose.yml所做的更改实施到分离的运行容器中

skp*_*rin 2 docker docker-compose

该项目当前正在此命令在后台运行:

docker-compose up -d
Run Code Online (Sandbox Code Playgroud)

我需要对它们进行两项更改docker-compose.yml

  • 添加一个新的容器
  • 更新以前的容器以具有指向新容器的链接

进行更改后:

注意<--我的更改的“ ”箭头

web:
        build: .
        restart: always
        command: ['tini', '--', 'rails', 's']
        environment:
            RAILS_ENV: production
            HOST: example.com
            EMAIL: admin@example.com
        links:
                - db:mongo
                - exim4:exim4.docker # <-- Add link
        ports:
                - 3000:3000
        volumes:
                - .:/usr/src/app
db:
        image: mongo
        restart: always
exim4: # <-------------------------------- Add new container
        image: exim4
        restart: always
        ports:
            - 25:25
        environment:
            EMAIL_USER: user@example.com
            EMAIL_PASSWORD: abcdabcdabcdabcd
Run Code Online (Sandbox Code Playgroud)

进行更改后,如何应用它们?(不破坏任何东西)

我试过了,docker-compose down && docker-compose up -d但这破坏了Mongo DB容器...我再也不能这样做了...:sob:

docker-compose restart说它不会识别对(来源:https : //docs.docker.com/compose/reference/restart/)所做的任何更改docker-compose.yml

docker-compose stop && docker-compose start 听起来像是不用我的更改就可以启动旧容器吗?


测试服务器:

  • Docker版本: 1.11.2,构建b9f10c9 / 1.11.2
  • docker -compose版本: 1.8.0,构建f3628c7

生产服务器可能使用较旧的版本,不确定是否会出现问题?

Siy*_*iyu 9

只是docker-compose up -d会做的工作。

输出应该像

> docker-compose up -d
Starting container1 ... done

> docker-compose up -d
container1 is up-to-date
Creating container2 ... done
Run Code Online (Sandbox Code Playgroud)

附带说明一下,docker-compose 并不是真正用于生产。您可能需要考虑 docker swarm。

  • “生产”的确切含义对于大、中、小型公司来说是不同的。对于后两组,对于某些项目,Docker Compose 可能已经足够,甚至更可取。 (2认同)

Abd*_*UMI 6

这里的关键是幂up等。


Dav*_*aze 5

如果只是docker compose up -d再次运行,它将注意到新容器和更改的配置并应用它们。

但:

(不破坏任何东西)

有许多设置只能在容器启动时设置。如果更改这些设置,则Docker Compose将删除并重新创建受影响的容器。例如,链接是仅启动选项,因此重新运行docker-compose up -d将删除并重新创建web容器。

这摧毁了Mongo DB容器...我再也不能这样做...

db:
    image: mongo
    restart: always
Run Code Online (Sandbox Code Playgroud)

volumes:为此添加一个选项,以便将数据存储在容器外部。您可以将其保存在一个可能由Docker Compose管理的命名卷中,该卷具有一些优点,但是主机系统目录可能更难以意外销毁。您必须删除并重新启动容器才能更改此选项。但是请注意,例如,如果MongoDB中存在安全更新,并且您需要新的映像,则还必须删除并重新启动容器。

您的理想状态是:

  • 实际的数据库(如MongoDB容器)将数据存储在命名卷或主机目录中
  • 应用程序(如您的Rails容器)在本地不存储任何内容,可以自由销毁和重新创建
  • 所有代码都在Docker映像中,可以始终从源代码控制中重建它们
  • 根据需要使用卷以注入配置文件并提取日志

如果丢失了整个/var/lib/docker目录(发生这种情况!),则实际上不应丢失任何状态,尽管您可能会因应用程序停机而结束。