有个需求, 需要用户在调试时能方便地将文件拷贝到容器里, 需要做个带ftp功能的容器,

参考了: https://github.com/rlesouef/alpine-sftp

整个工程目录结构:

其中download为各文件下载目录

拿tomcat来作例:

配置文件config_x86_online.yml:

 

也可以定义arm64架构的config来构建:

 

首先Dockerfile, 下面是Dockerfile模板:

base_alpine.j2

 

tomcat.j2

 

sftp-entrypoint.sh改了一下, 把后面启动sshd的删除了, 放到了supervisor管理, 另外增加了传环境变量来支持进行多目录挂载, 比如传:

-e “SFTP=sftp:sftp:1001:100:/usr/local/tomcat,tomcat;/etc/supervisor.d,supervisor.d”

可以将/usr/local/tomcat挂载到/home/sftp/tomcat

也可将/etc/supervisor.d挂载到/home/sftp/supervisor.d

运行用户自定义的脚本bindmount.sh

 

总的entrypoint.sh:

 

总构建脚本build.py:

 

后期可以基于base-alpine.j2来灵活定制, 如nginx.j2模板

 

node.j2:

 

最后执行命令构建:python build.py –config ./config/config_x86_online.yml

权限问题:

现在还有一个问题, 容器运行启来后, 比如java, 用户会在CMD命令里写地堆命令, 比如:

cd /app && mkdir org-api && unzip org-api.jar -d ./org-api/ && java -Xbootclasspath/a:/usr/local/conf $JAVA_OPTS $CATALINA_OPTS -jar org-api.jar

虽然运行sshd之前已经改过权限了, 但是容器运行时执行此命令的用户是root, 修改权限先于上面那一堆命令而运行,从而导致后面新出现的文件, 用sftp用户操作挂载目录出现没权限的问题。

解决此问题的思路:

尝试了supervisor的priority,也不好用,后来用inotify-tools来实时监控文件变化解决, 具体解决方法, 可以定义一个ini文件:

 

当用户被挂载的源目录出现变化时, 来更改挂载目标目录的权限

 

PS:

今天一直构建失败, 之前都是好好的, 查了半天, 原来是alpine淘宝源出问题了, bash都装的不正常, 构建时出现如下报错:

解决办法:

把淘宝源(mirrors.aliyun.com)换成中科大的源(mirrors.ustc.edu.cn)就好了

 

Categories: 未分类

0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *