最近遇到一个问题,用docker-compose编排的mysql和django服务,在django模型上加了一个没有默认值(就不想在模型上加default=xxx)的非空字段,这时候django会要求你提供一个默认值给这个字段。这时候容器将会启动失败。想尝试docker run单独启动django服务,但又依赖容器化的mysql服务。那该怎么办呢?
docker-compose.yml文件:
version: '2.0'
services:
mysql:
image: mysql:5.7
container_name: itom_service_mysql
restart: always
ports:
- "33063:3306"
volumes:
- ./docker_files/mysql/data:/var/lib/mysql
- ./docker_files/mysql/conf:/etc/mysql/conf.d
- ./docker_files/mysql/logs:/var/log/mysql
- ./docker_files/mysql/init:/docker-entrypoint-initdb.d/
environment:
- MYSQL_ROOT_PASSWORD=pwd123456
- TZ=Asia/Shanghai
command: [ 'mysqld' ]
networks:
- net-itom_service
backend:
image: jianbopei/itom_service:1.0.3
container_name: itom_service_django
restart: always
working_dir: /data/server/itom_service
env_file:
- .env
# 只在容器间暴露8000端口
expose:
- 8000
# 将容器8000映射到宿主机8000
# ports:
# - "8000:8000"
volumes:
- /data/server/itom_service/static #静态文件
- ./itom_service:/data/server/itom_service #代码
- ./itom_service/logs/:/data/server/itom_service/logs #日志
depends_on:
- mysql
networks:
- net-itom_service
command: ['sh', '/data/server/run/wait-for.sh', 'mysql:3306', '--', 'sh', '/data/server/run/start.sh']
networks:
net-itom_service:
driver: bridge
此时,就可以以交互式方式启动容器,到容器里面执行migrate命令并提供一个默认值。命令格式为:
docker-compose run your_service sh
your_service是docker-compose.yml文件中定义的服务名称,本例中为backend。
- 执行docker-compose run -d mysql,启动mysql容器以便做数据迁移
- 执行docker-compose run backend sh,以交互式启动django服务容器
- 以交互式启动容器后,就可以执行migrate命令并提供默认值了
当然如果你在backend定义了depend_on:mysql,也可以直接运行docker-compose run backend sh,这会自动帮你拉起mysql服务。文章来源:https://www.toymoban.com/news/detail-405518.html
总结:文章来源地址https://www.toymoban.com/news/detail-405518.html
- docker-compose也可以像docker一样以交互式方式启动容器
- docker-compose单独启动容器时,也会使用docker-compose.yml中定义的networks网络,所以不用担心上面的mysql和backend容器网络连通性问题
到了这里,关于docker-compose 以交互式方式运行你的容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!