# sonic-docker **Repository Path**: chenchengzj/sonic-docker ## Basic Information - **Project Name**: sonic-docker - **Description**: sonic新加一个docker目录结构 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-05-11 - **Last Updated**: 2024-01-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 要新加一个新的docker服务,需要在rules/目录下新增加一个mk文件,里面主要描述了生成镜像的名字、依赖的软件包等,接下来以我新增的test容器为例展示该mk文件内容 ``` # docker image for test DOCKER_TEST_STEM = docker-test DOCKER_TEST = $(DOCKER_TEST_STEM).gz DOCKER_TEST_DBG = $(DOCKER_TEST_STEM)-$(DBG_IMAGE_MARK).gz $(DOCKER_TEST)_PATH = $(DOCKERS_PATH)/$(DOCKER_TEST_STEM) ---Dockerfile等所需文件所在目录,对于该docker目录为dockers/docker-test $(DOCKER_TEST)_DEPENDS += $(SONIC_TEST) ----依赖的软件包,这里依赖于sonic-test.deb包(该包制作过程参考rules/sonic-test.mk),也可以依赖多个包;用于在Dockfile中安装对应依赖软件包 $(DOCKER_TEST)_DBG_DEPENDS = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_DEPENDS) $(DOCKER_TEST)_DBG_DEPENDS += $(SONIC_TEST_DBG) $(DOCKER_TEST)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BUSTER)--指明依赖的docker image $(DOCKER_TEST)_DBG_IMAGE_PACKAGES = $($(DOCKER_CONFIG_ENGINE_BUSTER)_DBG_IMAGE_PACKAGES) SONIC_DOCKER_IMAGES += $(DOCKER_TEST) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_TEST) -----改行一定要加,sonic根据SONIC_INSTALL_DOCKER_IMAGES来决定需要编译和安装的docker SONIC_DOCKER_DBG_IMAGES += $(DOCKER_TEST_DBG) SONIC_INSTALL_DOCKER_DBG_IMAGES += $(DOCKER_TEST_DBG) $(DOCKER_TEST)_CONTAINER_NAME = test ------容器名 $(DOCKER_TEST)_RUN_OPT += --privileged -t ------创建容器时参数 ``` 编译docker实际上是制作一个docker image的过程,会去$(DOCKER_TEST)_PATH下找Dockerfile,下面展示下docker-test和docker-platform-monitor的$(DOCKER_TEST)_PATH的目录结构 新添的docker-test目录结构 ``` ├── base_image_files │   └── test-cli ├── Dockerfile.j2 ├── start.sh └── supervisord.conf ``` 原有的docker-platform-monitor目录结构 ``` ├── base_image_files │   └── cmd_wrapper ├── critical_processes ├── Dockerfile.j2 ├── docker_init.sh ├── docker-pmon.supervisord.conf.j2 ├── lm-sensors.sh └── ssd_tools ├── iSmart └── SmartCmd ``` 其中Dockerfile.j2是用于通过j2命令生成Dockerfile的文件 base_images_files下的文件主要用于可以在宿主机下对对应docker容器进行某些具体操作 supervisord.conf和docker-pmon.supervisord.conf.j2其实是一个文件,在docker-platform-monitor中会在docker_init.sh中通过j2命令生成supervisord.conf,用于进程管理进程使用 critical_processes进程是用于指明重要进程,如果重要进程出现异常退出,则整个容器会exit 同时为了让docker服务能够自启动,需要在files/build_templates目录下新加一个service.j2文件,下面展示test.service.j2内容 ``` [Unit] Description=ut docker test container Requires=database.service updategraph.service After=database.service updategraph.service BindsTo=sonic.target After=sonic.target StartLimitIntervalSec=1200 StartLimitBurst=3 [Service] User={{ sonicadmin_user }} ExecStartPre=/usr/bin/{{docker_container_name}}.sh start ExecStart=/usr/bin/{{docker_container_name}}.sh wait ExecStop=/usr/bin/{{docker_container_name}}.sh stop Restart=always RestartSec=30 [Install] WantedBy=sonic.target ``` 如果docker依赖的软件包也是新建的,那么也需要在rules目录下新建mk文件,这里需要sonic-test.deb,是一个新的软件包,创建了一个sonic-test.mk文件,内容如下 ``` # sonic-test SONIC_TEST = sonic-test_1.0-1_$(CONFIGURED_ARCH).deb $(SONIC_TEST)_SRC_PATH = $(SRC_PATH)/sonic-test SONIC_MAKE_DEBS += $(SONIC_TEST) $(eval $(call add_extra_package,$(SONIC_TEST))) export SONIC_TEST ``` 文件主要指明了源文件所在目录,下面是src/sonic-test的目录结构 ``` ├── Makefile └── test ├── debian │   ├── changelog │   ├── control │   ├── copyright │   └── rules ├── Makefile └── test.c ``` 按照debian deb的制作规范创建文件 到此为止重新编译sonic-broadcom.bin之后再安装就可以通过docker images看到docker-test这个image,docker ps -a可以看到有个test容器运行着