Docker 撰写:避免重新创建数据容器
Docker Compose: Avoid recreation of data container
为了更新一些图像,我使用了 'docker-compose pull'。
然后我构建:'docker-compose build'.
我只想更新应用程序容器,所以我删除了
它并重新启动:
'docker-compose rm app' 和 'docker-compose up -d app'.
但是发生了一些不愉快的事情。数据容器也被重新创建。
旧数据丢失。
数据容器的 Dockerfile:
FROM gitlab/gitlab-ce:latest
VOLUME ["/etc/gitlab", "/var/log/gitlab", "/var/opt/gitlab"]
ENTRYPOINT ["hostname"]
docker-compose.yml:
version: '2'
services:
gitlab:
image: 'gitlab/gitlab-ce:latest'
domainname: example.com
hostname: gitlab
networks:
- devenv
restart: always
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
ports:
- '80:80'
- '2224:22'
volumes_from:
- gitlabdata
gitlabdata:
build: gitlab-data
下次我怎样才能避免这种情况?
docker-compose up
命令有 --no-recreate
标志。
如果容器已经存在,此标志将避免重新创建容器。
因此你可以运行
docker-compose up -d --no-recreate app
您的问题是因为您为容器创建了一个卷,然后删除了容器,这也删除了您的卷。
您应该更改您的卷,以便它们将挂载绑定到主机目录,这样您的文件就会存储在主机上,并且您可以重新附加到这些目录以防容器消失。另一个好处是能够从主机访问这些文件。
这是使用新卷配置后您的撰写文件的大致样子。
version: '2'
services:
gitlab:
image: 'gitlab/gitlab-ce:latest'
domainname: example.com
hostname: gitlab
networks:
- devenv
restart: always
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
ports:
- '80:80'
- '2224:22'
volumes_from:
- gitlabdata
gitlabdata:
build: gitlab-data
Volumes:
- /etc/gitlab:/dir/on/host
- /var/log/gitlab:/dir/on/host2
- /var/opt/gitlab:/dir/on/host3
您可以挂载到主机上您想要的任何内容。有关卷的更多信息:https://docs.docker.com/engine/userguide/containers/dockervolumes/#mount-a-host-directory-as-a-data-volume
我遇到了这个问题,就我而言,我总是重新启动 docker-compose 服务,重新创建容器:
我的/docker-撰写-app.service
[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/dockercnf
ExecStart=/usr/local/bin/docker-compose up --no-recreate -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
docker-compose.yml
version: '2'
services:
mysql2:
image: mysql/mysql-server:8.0
container_name: mysql2-container
networks:
static-network:
ipv4_address: 172.18.1.2
mysql57:
image: mysql/mysql-server:5.7
container_name: mysql57-container
networks:
static-network:
ipv4_address: 172.18.1.3
networks:
static-network:
ipam:
config:
- subnet: 172.18.0.0/16
#docker-compose v3+ do not use ip_range
ip_range: 172.18.1.0/24
我不知道我遗漏了什么或做错了什么。
已编辑 - 已解决
阅读 并得出我自己的结论后,我编辑了我的 docker-compose.yml 文件如下:
version: '2'
services:
mysql2:
image: mysql/mysql-server:8.0
container_name: mysql2-container
networks:
static-network:
ipv4_address: 172.18.1.2
mysql57:
image: mysql/mysql-server:5.7
container_name: mysql57-container
restart: always
volumes:
- /srv/mysql57-container:/var/lib/mysql
networks:
static-network:
ipv4_address: 172.18.1.3
networks:
static-network:
ipam:
config:
- subnet: 172.18.0.0/16
#docker-compose v3+ do not use ip_range
ip_range: 172.18.1.0/24
为了更新一些图像,我使用了 'docker-compose pull'。 然后我构建:'docker-compose build'.
我只想更新应用程序容器,所以我删除了 它并重新启动: 'docker-compose rm app' 和 'docker-compose up -d app'.
但是发生了一些不愉快的事情。数据容器也被重新创建。 旧数据丢失。
数据容器的 Dockerfile:
FROM gitlab/gitlab-ce:latest
VOLUME ["/etc/gitlab", "/var/log/gitlab", "/var/opt/gitlab"]
ENTRYPOINT ["hostname"]
docker-compose.yml:
version: '2'
services:
gitlab:
image: 'gitlab/gitlab-ce:latest'
domainname: example.com
hostname: gitlab
networks:
- devenv
restart: always
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
ports:
- '80:80'
- '2224:22'
volumes_from:
- gitlabdata
gitlabdata:
build: gitlab-data
下次我怎样才能避免这种情况?
docker-compose up
命令有 --no-recreate
标志。
如果容器已经存在,此标志将避免重新创建容器。
因此你可以运行
docker-compose up -d --no-recreate app
您的问题是因为您为容器创建了一个卷,然后删除了容器,这也删除了您的卷。
您应该更改您的卷,以便它们将挂载绑定到主机目录,这样您的文件就会存储在主机上,并且您可以重新附加到这些目录以防容器消失。另一个好处是能够从主机访问这些文件。
这是使用新卷配置后您的撰写文件的大致样子。
version: '2'
services:
gitlab:
image: 'gitlab/gitlab-ce:latest'
domainname: example.com
hostname: gitlab
networks:
- devenv
restart: always
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
ports:
- '80:80'
- '2224:22'
volumes_from:
- gitlabdata
gitlabdata:
build: gitlab-data
Volumes:
- /etc/gitlab:/dir/on/host
- /var/log/gitlab:/dir/on/host2
- /var/opt/gitlab:/dir/on/host3
您可以挂载到主机上您想要的任何内容。有关卷的更多信息:https://docs.docker.com/engine/userguide/containers/dockervolumes/#mount-a-host-directory-as-a-data-volume
我遇到了这个问题,就我而言,我总是重新启动 docker-compose 服务,重新创建容器:
我的/docker-撰写-app.service
[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/dockercnf
ExecStart=/usr/local/bin/docker-compose up --no-recreate -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
docker-compose.yml
version: '2'
services:
mysql2:
image: mysql/mysql-server:8.0
container_name: mysql2-container
networks:
static-network:
ipv4_address: 172.18.1.2
mysql57:
image: mysql/mysql-server:5.7
container_name: mysql57-container
networks:
static-network:
ipv4_address: 172.18.1.3
networks:
static-network:
ipam:
config:
- subnet: 172.18.0.0/16
#docker-compose v3+ do not use ip_range
ip_range: 172.18.1.0/24
我不知道我遗漏了什么或做错了什么。
已编辑 - 已解决
阅读
version: '2'
services:
mysql2:
image: mysql/mysql-server:8.0
container_name: mysql2-container
networks:
static-network:
ipv4_address: 172.18.1.2
mysql57:
image: mysql/mysql-server:5.7
container_name: mysql57-container
restart: always
volumes:
- /srv/mysql57-container:/var/lib/mysql
networks:
static-network:
ipv4_address: 172.18.1.3
networks:
static-network:
ipam:
config:
- subnet: 172.18.0.0/16
#docker-compose v3+ do not use ip_range
ip_range: 172.18.1.0/24