本文主要是讲述了如何基于Docker进行开发环境的搭建,避免应该Linux版本的差异导致将时间浪费在环境的搭建上。另外在新人参与到开发时也可以不用重新搭建环境直接使用搭建好的Docker Image进行开发,

在Ubuntu虚拟机上如何安装Docker

官方教程
Docker安装
  • 进行ubuntu系统的更新并安装相关软件
t@t:~/Midea_Develop/Open_Source/Amazon/avs-device-sdk$ sudo apt-get update
[sudo] t 的密码: 
命中:1 http://security.ubuntu.com/ubuntu bionic-security InRelease
命中:2 http://cn.archive.ubuntu.com/ubuntu bionic InRelease
命中:3 http://cn.archive.ubuntu.com/ubuntu bionic-updates InRelease
命中:4 http://cn.archive.ubuntu.com/ubuntu bionic-backports InRelease
正在读取软件包列表... 完成   
t@t:~/Midea_Develop/Open_Source/Amazon/avs-device-sdk$ sudo apt-get install \
>     apt-transport-https \
>     ca-certificates \
>     curl \
>     gnupg \
>     lsb-release
  • 安装docker的官方GPG Key
    执行如下指令
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  • 添加 Docker的仓库地址
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 进行Docker Engine的安装
t@t:~/Midea_Develop/Open_Source/Amazon/avs-device-sdk$  sudo apt-get install docker-ce docker-ce-cli containerd.io
  • 在安装完成后,基于Docker的示例Image - hello-world进行环境验证
t@t:~/Midea_Develop/Open_Source/Amazon/avs-device-sdk$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete 
Digest: sha256:5122f6204b6a3596e048758cabba3c46b1c937a46b5be6225b835d091b90e46c
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

通过以上的操作,就完成了Ubuntu下的Docker环境搭建了,官方的文档已经讲述的很清楚了,希望更多的通过官网进行Docker的相关学习

在Docker上使用官网的ubuntu image和必要环境配置

如何拉取Ubuntu和创建container
  • 从Docker官方仓库拉取ubuntu iamge, 我这里使用的是ubuntu 18.04.
sudo docker pull ubuntu:bionic-20210416

补充说明: bionic-20210416 为ubuntu的tag,对于需要安装ubuntu不同的版本请参考官网文档: https://hub.docker.com/_/ubuntu/ 修改不同的tag.

  • 在执行pull指令进行ubuntu image的拉取后,通过运行docker的如下指令进行验证,相关image是否正常拉取.
    运行 sudo docker images查看当前本地有几个可使用的image
t@t:~/Midea_Develop/Open_Source/Amazon$ sudo docker images
REPOSITORY    TAG               IMAGE ID       CREATED        SIZE
ubuntu        bionic-20210416   4eb8f7c43909   3 weeks ago    63.1MB
hello-world   latest            d1165f221234   2 months ago   13.3kB
基于ubuntu image 创建container并挂载本地的AVS SDK源码目录

运行sudo docker run 相关指令,

sudo docker run -it --restart=always -p 10023:22 -v /home/Midea_Develop/Open_Source/Amazon/avs-device-sdk/ --name amazon_avs_sdk  ubuntu:bionic-20210416 /bin/bash

执行成功后可以通过sudo docker ps 进行运行中的container查看

t@t:~/Midea_Develop/Open_Source/Amazon$ sudo docker ps 
CONTAINER ID   IMAGE                    COMMAND       CREATED          STATUS          PORTS                                     NAMES
b0ac726fc6a1   ubuntu:bionic-20210416   "/bin/bash"   56 minutes ago   Up 22 minutes   0.0.0.0:10023->22/tcp, :::10023->22/tcp   amazon_avs_sdk

在退出Docker中的ubuntu后,可以通过执行sudo docker exec

t@t:~/Midea_Develop/Open_Source/Amazon$ sudo docker ps -a
CONTAINER ID   IMAGE                    COMMAND       CREATED          STATUS          PORTS                                     NAMES
b0ac726fc6a1   ubuntu:bionic-20210416   "/bin/bash"   59 minutes ago   Up 24 minutes   0.0.0.0:10023->22/tcp, :::10023->22/tcp   amazon_avs_sdk

t@t:~/Midea_Develop/Open_Source/Amazon$ sudo docker exec -it b0ac726fc6a1  /bin/bash
root@b0ac726fc6a1:/#

在进入到Docker Ubuntu界面后,可以看到根目录自动创建了Amazon目录,并挂载了Amazon AVS SDK的相关文件

root@b0ac726fc6a1:/# ls Amazon/avs
avs-device-sdk/     avs_sdk_devlop.tar  
root@b0ac726fc6a1:/# ls Amazon/avs-device-sdk/
ACL        AVSGatewayManager         CMakeLists.txt        Captions         Endpoints       LICENSE.txt  PlaylistParser       Settings                ThirdParty    cmakeBuild         pkg-config.pc.cmake
ADSL       ApplicationUtilities      CONTRIBUTING.md       CertifiedSender  Integration     MediaPlayer  README.md            SpeechEncoder           applications  core               shared
AFML       BluetoothImplementations  CapabilitiesDelegate  ContextManager   InterruptModel  Metrics      RegistrationManager  Storage                 build         doc                tools
AVSCommon  CHANGELOG.md              CapabilityAgents      Diagnostics      KWD             NOTICE.txt   SampleApp            SynchronizeStateSender  capabilities  issue_template.md
root@b0ac726fc6a1:/#

补充说明: 在进行AVS C++ SDK 基于Docker的环境搭建时,我们的代码文件是放在主机的不会放在Docker环境,所以需要通过Docker相关命令将文件夹挂载到Docker Ubuntu上
在前面运行的如下指令中, -v 指定了我们要挂载的目录(也就是我们AVS C++ SDK解压到的目录),而源码目录后跟着的:/Amazon 是指在Docker Ubuntu下挂载到的目录,该目录会自动创建并挂载AVS C++ SDK源码目录.
而ubuntu:bionic-20210416是指我们要创建的container来源的iamge.

sudo docker run -it --restart=always -p 10023:22 -v /home/Midea_Develop/Open_Source/Amazon/avs-device-sdk/:/Amazon --name amazon_avs_sdk  ubuntu:bionic-20210416 /bin/bash
Docker 下ubuntu ssh服务的搭建

在创建完AVS C++ SDK的Docker容器后,后需要的开发中一般该容器都是运行在后台的,所以需要搭建sshd的服务,支持远程ssh的登入.

  • 进入Docker Ubuntu 进行相关软件的安装
t@t:~/Midea_Develop/Open_Source/Amazon$ sudo docker exec -it b0ac726fc6a1  /bin/bash  
# b0ac726fc6a1   为container id
  • 安装vim
    在初始状态直接进行安装vim会报如下错误,需要进行apt-get仓库的更新
root@b0ac726fc6a1:/# apt-get install vim 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package vim
root@b0ac726fc6a1:/# apt-get update      
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]

vim安装

在root@b0ac726fc6a1:/# apt-get install vim 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
  • ssh服务搭建
    首先进行sshd-server的安装
root@b0ac726fc6a1:/# apt-get install openssh-server

在成功安装后,进行sshd配置文件的修改,改为支持root用户的登入
vim 打开sshd的配置文件sshd_config

root@b0ac726fc6a1:/# vim /etc/ssh/sshd_config

将配置文件中的PermitRootLogin 修改为yes

#PermitRootLogin prohibit-password
PermitRootLogin yes

然后重启sshd服务

root@b0ac726fc6a1:/# service ssh restart
 * Restarting OpenBSD Secure Shell server sshd

重启完sshd服务后,还需要给root设置密码,运行passwd设置密码
后续ssh登入需要用到

在这root@b0ac726fc6a1:/# passwd  
Enter new UNIX password:

最后在执行完以上操作后,可以通过ssh进行docker ubuntu的登入了.

t@t:~/Midea_Develop/Open_Source/Amazon$ ssh root@localhost -p 10023 
root@localhost's password: 
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-72-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.
Last login: Wed May 19 02:38:52 2021 from 172.17.0.1
root@b0ac726fc6a1:~#

补充说明,-p后面的10023是前面在运行docker run指令所指定的,和23端口的映射.

在完成基本环境的搭建后,常用的Docker指令说明
  • docker export
    可以将已经完成环境搭建的Docker container导出为本地的image文件
sudo docker export b0ac726fc6a1 -o avs_sdk_devlop.tar

b0ac726fc6a1 为container id, 可以通过docker ps -a进行查看

  • docker ps
    查看当前运行中的container相关信息的状态
sudo docker ps 
[sudo] t 的密码: 
CONTAINER ID   IMAGE                    COMMAND       CREATED             STATUS          PORTS                                     NAMES
b0ac726fc6a1   ubuntu:bionic-20210416   "/bin/bash"   About an hour ago   Up 49 minutes   0.0.0.0:10023->22/tcp, :::10023->22/tcp   amazon_avs_sdk

加-a参数,可以看到所有的container

  • docker container rm
    进行指定container的删除

其它的指令,请查阅Docker官方文档进行学习.

  • docker run --device=/dev/snd:/dev/snd …
    在创建新的container的时候可以通过–device参数,将Host的声卡映射到Docker Ubuntu下

Docker Ubuntu下AVS C++ SDK的编译

Set Up the AVS Device SDK on Ubuntu 如上链接,Amazon Alexa的官方提供详细的指导书,请将Docker Ubuntu 当做正常的ubuntu进行操作即可.

在编译环境搭建完后,可以将对应的container导出生成新的image.

sudo docker export b0ac726fc6a1 -o avs_sdk_dev.tar
# b0ac726fc6a1  为container id

对avs_sdk_dev.tar的使用

sudo docker import avs_sdk_dev.tar
#执行上面指令后,可以通过sudo docker images 进行本地存在的image list进行查看
sudo docker tag 6334ffd87859 avs_sdk:1.0
#6334ffd87859  为image id,为image打tag 
# 最后在运行sudo docker run进行container的创建
sudo docker run --device=/dev/snd:/dev/snd  -it --restart=always -p 10023:22 -v /home/t/Midea_Develop/Open_Source/Amazon/AVS_DEV/:/Amazon --name avs_dev  avs_sdk:1.0 /bin/bash

总结

有任何关于AVS C++ SDK开发的问题,请及时留言沟通.
avs-device-sdk源码地址

参考链接:
Docker官方 相关指令说明文档