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

时间:2019-01-09 16:04:32

标签: docker docker-compose

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

docker-compose up -d

我需要对其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

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

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

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

docker-compose stop && docker-compose start听起来像是在不进行更改的情况下启动旧容器?


测试服务器:

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

生产服务器可能使用的是较早版本,不确定是否会造成问题?

2 个答案:

答案 0 :(得分:4)

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

但是:

  

(不破坏任何东西)

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

  

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

db:
    image: mongo
    restart: always

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

您的理想状态是:

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

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

答案 1 :(得分:1)

docker-compose up -d就可以完成工作。

输出应该像

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

> docker-compose up -d
container1 is up-to-date
Creating container2 ... done

请注意,docker-compose并非真正用于生产。您可能要考虑使用docker swarm。