当前位置: 首页 > news >正文

构建自己的docker的ftp镜像

aarch64系统可运行的docker镜像

构建自己的vsftpd镜像,我是在windows系统下的docker desktop中构建运行于aarch64 GNU/Linux系统的ftp镜像。

系统环境:

Welcome to Debian GNU/Linux  with Linux x.x.x

dockerfile

FROM ubuntu:latestUSER rootRUN apt-get update && apt-get clean
RUN apt-get install -y vsftpd
RUN apt-get cleanCOPY vsftpd.conf /etc/vsftpd/EXPOSE 20 21# 复制启动脚本
COPY entrypoint.sh /etc/vsftpd/entrypoint.sh
RUN chmod +x /etc/vsftpd/entrypoint.sh# 设置启动脚本为默认入口
ENTRYPOINT ["/etc/vsftpd/entrypoint.sh"]

entrypoint.sh(注意如果你是在windows系统下编写的可能到系统上运行不了,所以可以在系统上编写此文件)

#!/bin/bash
if [ -z "$FTP_USER"] || [ -z "$FTP_PASSWORD"]; thenecho "require user info"exit 1
fiuseradd -m -s /bin/bash $FTP_USER
echo "$FTP_USER:$FTP_PASSWORD" | chpasswd/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

vsftpd.conf

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
allow_writeable_chroot=YES
pasv_min_port=21100
pasv_max_port=21110

文件已经准备好,构建镜像命令:--platform 参数表示构建镜像的目标平台

使用docker buildx命令构建aarch64架构的镜像

docker buildx build --platform linux/arm64 -t test:0.1 --load .


buildx 是 Docker 官方提供的一个构建工具,它可以帮助用户快速、高效地构建 Docker 镜像,并支持多种平台的构建。使用 buildx,用户可以在单个命令中构建多种架构的镜像,例如 x86 和 ARM 架构,而无需手动操作多个构建命令。此外,buildx 还支持 Dockerfile 的多阶段构建和缓存,这可以大大提高镜像构建的效率和速度。Docker Desktop,则默认安装了 buildx

docker buildx version

普通构建失败,使用Dockerfile自己做的服务镜像,docker run时启动失败:

docker报错standard init linux.go:228 exec user process caused: exec format error

当前服务器的CPU架构和构建镜像时的CPU架构不兼容。比如做镜像是在arm机器下构建的,而docker run是在amd架构下执行的。排查:

查看当前服务器的CPU架构信息

# Linux信息
uname -a
# 或
lscpu

查看镜像架构:

docker inspect test:0.1

系统和镜像查看如下则无问题:

此镜像可运行支持账号密码。注意,挂载目录要和账号同一目录。

docker run -d --privileged=true  -p 21:21 -p 20:20 -v /test:/home/ftpuser/ -e FTP_USER=ftpuser -e FTP_PASSWORD=123456  --name test test:1.0

查看容器挂载目录

 docker inspect -f '{{ .Mounts }}' 容器id

centos系统可运行的docker镜像

(参考大佬的:https://github.com/fauria/docker-vsftpd )

构建好的镜像可以直接私聊我发送。上传不了资源。

dockerfile

FROM centos:7
ADD Centos-7.repo /etc/yum.repos.d/CentOS-Base.repoUSER root
ARG USER_ID=14
ARG GROUP_ID=50RUN yum -y update && yum clean all
RUN yum install -y \vsftpd \db4-utils \db4 \iproute && yum clean allRUN usermod -u ${USER_ID} ftp
RUN groupmod -g ${GROUP_ID} ftpENV FTP_USER=**String** \FTP_PASS=**Random** \PASV_ADDRESS=**IPv4** \PASV_ADDR_RESOLVE=NO \PASV_ENABLE=YES \PASV_MIN_PORT=21100 \PASV_MAX_PORT=21110 \XFERLOG_STD_FORMAT=NO \LOG_STDOUT=**Boolean** \FILE_OPEN_MODE=0666 \LOCAL_UMASK=077 \REVERSE_LOOKUP_ENABLE=YES \PASV_PROMISCUOUS=NO \PORT_PROMISCUOUS=NOCOPY vsftpd.conf /etc/vsftpd/
COPY vsftpd_virtual /etc/pam.d/
COPY run-vsftpd.sh /usr/sbin/RUN set -x; chmod +x /usr/sbin/run-vsftpd.sh \&& mkdir -p /home/vsftpd/ \&& chown -R ftp:ftp /home/vsftpd/VOLUME /home/vsftpd
VOLUME /var/log/vsftpdEXPOSE 20 21CMD ["/usr/sbin/run-vsftpd.sh"]

run-vsftpd.sh

#!/bin/bash# If no env var for FTP_USER has been specified, use 'admin':
if [ "$FTP_USER" = "**String**" ]; thenexport FTP_USER='admin'
fi# If no env var has been specified, generate a random password for FTP_USER:
if [ "$FTP_PASS" = "**Random**" ]; thenexport FTP_PASS=`cat /dev/urandom | tr -dc A-Z-a-z-0-9 | head -c${1:-16}`
fi# Do not log to STDOUT by default:
if [ "$LOG_STDOUT" = "**Boolean**" ]; thenexport LOG_STDOUT=''
elseexport LOG_STDOUT='Yes.'
fi# Create home dir and update vsftpd user db:
mkdir -p "/home/vsftpd/${FTP_USER}"
chown -R ftp:ftp /home/vsftpd/echo -e "${FTP_USER}\n${FTP_PASS}" > /etc/vsftpd/virtual_users.txt
/usr/bin/db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db# Set passive mode parameters:
if [ "$PASV_ADDRESS" = "**IPv4**" ]; thenexport PASV_ADDRESS=$(/sbin/ip route|awk '/default/ { print $3 }')
fiecho "pasv_address=${PASV_ADDRESS}" >> /etc/vsftpd/vsftpd.conf
echo "pasv_max_port=${PASV_MAX_PORT}" >> /etc/vsftpd/vsftpd.conf
echo "pasv_min_port=${PASV_MIN_PORT}" >> /etc/vsftpd/vsftpd.conf
echo "pasv_addr_resolve=${PASV_ADDR_RESOLVE}" >> /etc/vsftpd/vsftpd.conf
echo "pasv_enable=${PASV_ENABLE}" >> /etc/vsftpd/vsftpd.conf
echo "file_open_mode=${FILE_OPEN_MODE}" >> /etc/vsftpd/vsftpd.conf
echo "local_umask=${LOCAL_UMASK}" >> /etc/vsftpd/vsftpd.conf
echo "xferlog_std_format=${XFERLOG_STD_FORMAT}" >> /etc/vsftpd/vsftpd.conf
echo "reverse_lookup_enable=${REVERSE_LOOKUP_ENABLE}" >> /etc/vsftpd/vsftpd.conf
echo "pasv_promiscuous=${PASV_PROMISCUOUS}" >> /etc/vsftpd/vsftpd.conf
echo "port_promiscuous=${PORT_PROMISCUOUS}" >> /etc/vsftpd/vsftpd.conf# Get log file path
export LOG_FILE=`grep xferlog_file /etc/vsftpd/vsftpd.conf|cut -d= -f2`# stdout server info:
if [ ! $LOG_STDOUT ]; then
cat << EOBSERVER SETTINGS---------------· FTP User: $FTP_USER· FTP Password: $FTP_PASS· Log file: $LOG_FILE· Redirect vsftpd log to STDOUT: No.
EOB
else/usr/bin/ln -sf /dev/stdout $LOG_FILE
fi# Run vsftpd:
&>/dev/null /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

vsftpd_virtual

#%PAM-1.0
auth	required	pam_userdb.so	db=/etc/vsftpd/virtual_users
account	required	pam_userdb.so	db=/etc/vsftpd/virtual_users
session	required	pam_loginuid.so

vsftpd.conf

# Run in the foreground to keep the container running:
background=NO# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO# Uncomment this to allow local users to log in.
local_enable=YES## Enable virtual users
guest_enable=YES## Virtual users will use the same permissions as anonymous
virtual_use_local_privs=YES# Uncomment this to enable any form of FTP write command.
write_enable=YES## PAM file name
pam_service_name=vsftpd_virtual## Home Directory for virtual users
user_sub_token=$USER
local_root=/home/vsftpd/$USER# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
chroot_local_user=YES# Workaround chroot check.
# See https://www.benscobie.com/fixing-500-oops-vsftpd-refusing-to-run-with-writable-root-inside-chroot/
# and http://serverfault.com/questions/362619/why-is-the-chroot-local-user-of-vsftpd-insecure
allow_writeable_chroot=YES## Hide ids from user
hide_ids=YES## Enable logging
xferlog_enable=YES
xferlog_file=/var/log/vsftpd/vsftpd.log## Enable active mode
port_enable=YES
connect_from_port_20=YES
ftp_data_port=20## Disable seccomp filter sanboxing
seccomp_sandbox=NO### Variables set at container runtime

Centos-7.repo

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7#released updates 
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

相关文章:

构建自己的docker的ftp镜像

aarch64系统可运行的docker镜像 构建自己的vsftpd镜像&#xff0c;我是在windows系统下的docker desktop中构建运行于aarch64 GNU/Linux系统的ftp镜像。 系统环境&#xff1a; Welcome to Debian GNU/Linux with Linux x.x.x dockerfile FROM ubuntu:latestUSER rootRUN ap…...

人机交互革命,为智能座舱市场激战注入一针「催化剂」

从AIGC到AGI赋能&#xff0c;智能座舱人机交互体验迎来新范式。 不断训练、迭代的大模型&#xff0c;为智能座舱带来了更全面的感知能力、更准确的认知理解&#xff0c;以及更丰富的交互模态&#xff0c;显著提升了其智能化水平。 “AI大模型的快速应用与迭代&#xff0c;推动…...

数据结构复习记录

基本概念 线性表 线性表是最简单也最常用的一种数据结构&#xff0c;是由n( n ≥ 0 n\geq0 n≥0)个类型相同的数据元素组成的有限序列&#xff0c;是一种逻辑结构&#xff0c;有两种表示方式&#xff08;即存储结构&#xff09;&#xff1a;顺序表示和链式表示。 栈和队列 栈…...

Qt自定义checkbox实现按下回车键该项打勾

引言 开发环境代码结构示例代码运行效果总结使用qt实现一个列表,列表中每一项中的类似一个checkbox,通过上下键可以切换选中项,按下回车键在已经选中的项前出现对勾。效果如下: 20241203_163929 开发环境 使用ubuntu下QtCreator4.11.。 代码结构 这里将项目的结构截图贴…...

头歌作业 数据库与大数据管理 期末复习资料

1、 下列说法错误的是&#xff1f;c A、UserCF算法推荐的是那些和目标用户有共同兴趣爱好的其他用户所喜欢的物品 B、ItemCF算法推荐的是那些和目标用户之前喜欢的物品类似的其他物品 C、UserCF算法的推荐更偏向个性化 D、UserCF随着用户数目的增大&#xff0c;用户相似度…...

2023年华数杯数学建模A题隔热材料的结构优化控制研究解题全过程文档及程序

2023年华数杯全国大学生数学建模 A题 隔热材料的结构优化控制研究 原题再现&#xff1a; 新型隔热材料 A 具有优良的隔热特性&#xff0c;在航天、军工、石化、建筑、交通等高科技领域中有着广泛的应用。   目前&#xff0c;由单根隔热材料 A 纤维编织成的织物&#xff0c;…...

如何抓取亚马逊页面动态加载的内容:Python爬虫实践指南

引言 在现代电商领域&#xff0c;数据的重要性不言而喻。亚马逊作为全球领先的电商平台&#xff0c;其页面上动态加载的内容包含了丰富的商品信息。然而&#xff0c;传统的爬虫技术往往难以应对JavaScript动态加载的内容。本文将详细介绍如何使用Python结合Selenium工具来抓取…...

在线钢琴源码

在线钢琴源码 是利用HTML5技术开发的在线钢琴应用&#xff0c;致力于为钢琴爱好者、音乐爱好者提供一个优雅、简洁的平台 在学习工作之余可以在线弹钢琴&#xff0c;享受音乐、生活的美好。自由钢琴支持自动演奏和手动演奏&#xff0c;简单易学&#xff0c;快来试试吧 源码截…...

【OpenDRIVE_Python】使用python脚本输出OD数据中含有信号灯地物的道路ID和信号灯信息

示例代码说明&#xff1a; 遍历OD数据中每条道路Road,若Road中存在信号灯地物signal&#xff0c;则将该道路ID和包含的所有信号灯输出到xml文件中。补充&#xff1a;一个Road中可能存在多个信号灯signal&#xff0c;这里取signal的上级标签signals&#xff0c;则将所有信号灯同…...

普中51单片机——LED流水灯模块

1、GPIO概念 GPIO&#xff08;general purpose intput output&#xff09;是通用输入输出端口的简称&#xff0c;可以通过软件来控制其输入和输出。51 单片机芯片的 GPIO 引脚与外部设备连接起来&#xff0c;从而实现与外部通讯、 控制以及数据采集的功能。 1.1、GPIO分类 &a…...

智已汽车x-signature 登录算法 签到

智已汽车x-signature 登录算法 签到 python代码成品...

浅谈留学essay之初级研究:What, why and how

所谓初级研究&#xff08;primary research&#xff09;指的是对研究者从观察、实践、访谈、问卷等第一手研究方法中得出的原始数据进行分析的研究方式。其主要特征是直接性&#xff08;directness&#xff09;、客观性&#xff08;factual&#xff09;、一手性&#xff08;fir…...

Mac启动服务慢问题解决,InetAddress.getLocalHost().getHostAddress()慢问题。

项目启动5分钟&#xff0c;很明显有问题。像网上其他的提高jvm参数就不说了&#xff0c;应该不是这个问题&#xff0c;也就快一点。 首先找到自己的电脑名称&#xff08;用命令行也行&#xff0c;只要能找到自己电脑名称就行&#xff0c;这里直接在共享里看&#xff09;。 复制…...

电商营销活动-抽奖业务

目录 一、抽奖系统的核心功能 二、抽奖系统的业务逻辑 三、抽奖系统的业务优势 四、抽奖系统的业务注意事项 电商营销活动中的抽奖系统业务&#xff0c;是一种通过设立抽奖活动来吸引用户参与、提升用户活跃度和转化率的营销手段。以下是对电商营销活动抽奖系统业务的详细解…...

虚拟DOMdiff算法

一.什么是虚拟DOM&#xff1f; 虚拟DOM是 VUE 一个比较核心的概念&#xff0c;为什么会有虚拟DOM呢&#xff1f;首先可以与传统的网页开发做个对比&#xff0c;在没有 VUE 和 REACT 框架之前&#xff0c;我们都是使用原生 JavaScript 或者 jQuery&#xff0c;那时候是直接对 D…...

IDEA实现javaweb用户登录(增删改查)

IDEA实现javaweb用户登录&#xff08;增删改查&#xff09; 文章目录 IDEA实现javaweb用户登录&#xff08;增删改查&#xff09;前言一、IDEA 软件的简单使用1 创建一个普通 java 项目2 新增 web 配置将项目由普通的Java项目变为 javaweb项目2.1 新增 web 配置2.2 新增项目文件…...

JS进阶01-异步编程、跨域、懒加载

目录 一、异步编程 1.1.异步编程的基本概念与重要性 1.2.事件循环&#xff08;Event Loop&#xff09;机制 1.3.JavaScript异步编程的常见方式及详解 示例 1.4.异步编程的最佳实践 二、跨域 2.1.什么是跨域 2.2.怎么解决跨域 1. JSONP&#xff08;JSON with Padding&…...

2012年 数模美赛 C题 犯罪克星

一、问题重述 银河犯罪建模中心&#xff08;ICM&#xff09;正在调查一个犯罪阴谋。调查人员已经识别出一些阴谋成员&#xff0c;但希望在逮捕之前确定其他成员和领导人。所有嫌疑人和可能的同谋者都受雇于同一家公司&#xff0c;并在一个大的综合办公室里工作。该公司正在开发…...

社区团购中 2+1 链动模式商城小程序的创新融合与发展策略研究

摘要&#xff1a;本文聚焦于社区团购这一新兴零售模式的发展态势&#xff0c;深入探讨 21 链动模式商城小程序与之融合的创新机制与应用策略。通过剖析社区团购的运营模式、优势特点以及发展现状&#xff0c;结合 21 链动模式商城小程序的功能特性&#xff0c;研究二者协同作用…...

【Go底层】time包Ticker定时器原理

目录 1、背景2、go版本3、源码解释【1】Ticker结构【2】NewTicker函数解释 4、代码示例5、总结 1、背景 说到定时器我们一般想到的库是cron&#xff0c;但是对于一些简单的定时任务场景&#xff0c;标准库time包下提供的定时器就足够我们使用&#xff0c;本篇文章我们就来研究…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...