vscode中使用docker容器开发的问题
工具:vscode
安装插件:remote container
语言:python
使用vscode进行容器化开发时,一些配置信息通常放在项目根目录的.env文件中,在代码中使用DB_URL = sha_decode(os.environ.get('HX_DATABASE'))
获取相关配置并使用。下面是一个.env文件示例。
REDIS_IMAGE=redis:3.2-alpine
PATA_IMAGE=ip/bot/image_name:1.18
#HX_DATABASE=mysql+pymysql://username:password@ip:port/database?charset=utf8
HX_DATABASE=加密后的串
CALLBACK_URL=http://ip:port/router/rest?
PPX_APPKEY=密串
PPX_APPSECRET=密串
GEN_MAC_URL=http://ip:port/api/open/mac/create
TELEGRAF_UDP_CONF=ip:port:xxx
TELEGRAF_UDP_CONF2=ip:port:xxx
IS_MOCK=1
前段时间公司要将本地测试库统一迁移,所以要修改HX_DATABASE为新的内容,然后我就按照常理修改.env文件了,但是发现修改后,代码中的一部分使用到链接的地方用的是新库,另一部分用的是老库。经过和同事的一般研究发现了一些结果,谨记录。
在.env文件存放配置信息后,在config.py使用类似DB_URL = sha_decode(os.environ.get('HX_DATABASE'))
的代码,获取相关配置,然后在db.py中,创建连接池,获取连接。随后即可在其他代码中import到db,并使用。
使用vscode的插件remote container可以让我们在容器内打开服务,默认开启的服务端口是8000,开启后我们可以通过8000端口访问得到对应的服务,然后访问任何一个用得到数据库的地方,展示出来的数据都是老库中的数据,因为此时的数据库连接使用的docker容器内的环境变量,在我们第一次创建容器时会读取.env文件,之后就不会随着.evn文件中对应的值改变而改变了。
而当我们添加5000端口转发,然后在vsc中debug对应的服务,再通过5000端口访问某服务,如果有使用数据库的地方,展示出来的数据都是新库中的数据。
这是因为我们debug时vsc会加载.env文件,去读取配置,更改我们debug时的环境变量,然后使用5000端口访问的时debug的服务,不会影响到容器本身的8000端口的服务。
要注意在远程打开代码时,会默认开启一个端口为8000的服务,此服务跟我们debug的5000端口的服务不相关,不影响。
要想在访问8000端口的docker服务时,加载最新的数据库配置,需要编辑 .devcontainer/docker-compose.yml 中的x-defaults.environment.HX_DATABASE的值为你所需要的最新链接,然后重新rebuid即可。
上述情况在linux上开启服务不同。
linux服务器上使用docker-compose up运行打包好的镜像,开启镜像服务时,目录下会有一个docker-compose.yml和.env文件,这个.env文件修改配置后会重启服务会生效,因为这种方式是docker服务的方式,不是使用vsc工具的远程插件开启的服务。