Docker 如何实现非root用户构建httpd镜像以及遇到的问题有哪些

为什么要用非root来构建httpd呢?

由于公司云平台,一般的web组件。不允许用root用户来部署相关应用程序。所以只能编写dockerfile先构建镜像,然后再部署到云平台(kubenetes集群),主要从安全问题来考虑的。还有本来我这个职位职责是管理租户应用问题,但是测试机器没部署。只能自己找镜像,写file部署。中间遇到了很多问题,可能由于我的技术比较菜导致的吧。掉坑里一天出不来,最后还是慢慢排错出来的。不聊别的了,聊聊技术吧。

  • 首先我们需要准备一个干净的镜像,因为我们云平台有docker仓库Harbor。所以我只需要使用命令拉取镜像:
docker push 10.0.0.1/public/bclinux:1.1.1
  • 拉取镜像之后,需要使用docker run 命令去运行,我拉取的镜像:
docker run --name tudo:1.1.1 -tid 10.0.0.1/public/bclinux:1.1.1
  • 进入运行的docker的容器中(未运行的叫镜像、运行了就叫容器了)
docker exec -ti tudo:1.1.1 /bin/bash
  • 修改基础镜像的yum源文件,因为内网涉及安全问题一般yum源配置是:
cat >/etc/yum.repos.d/os.repo<<EOF
[centos7]
name=Server
baseurl=http://10.0.0.1/fpz #源路径
gpgcheck=0
gpgcheck=1             #是否检查GPG(GNU Private Guard),一种密钥方式签名。 
EOF
  • 使用yum install -y httpd 部署安装完成后使用systemctl启动报错
# systemctl start httpd 
System has not been booed with systemd as init system (PID 1).Can't operate.
Failed to connect to bus: Host is down 
  • 怎么解决报错呢?答案是跳过这种方式去启动httpd直接用路径启动
#type httpd
httpd is /usr/sbin/httpd
  • 执行完命令发现还有问题
#/usr/sbin/httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.0.0.9. Set the 'ServerName' directive globally to suppress this message 
httpd (pid 18)  already running
报错的意思是我们没有修改/etc/httpd/conf/http.conf配置文件的参数导致 
ServerName localhost:80
再启动
#/usr/sbin/httpd
启动成功了
  • 启动后我们要编写docker file文件
vi /date/dockerfile
FROM 10.0.0.1/public/bclinux:1.1.1
RUN groupadd www
RUN useradd www -g www -u 1911
RUN chown -R www:www  /etc/httpd/conf/httpd.conf
RUN chmod -R 755 /etc/httpd/conf/httpd.conf
RUN chown -R www:www /usr/sbin/httpd
RUN chown -R www:www /etc/httpd/logs/
RUN chmod -R 755 /etc/httpd/logs/
RUN chown -R www:www /run/httpd/
RUN chmod -R 755 /run/httpd
RUN chmod -R 755 /usr/sbin/httpd
RUN mkdir -p  /var/tmp/logs/
RUN chown -R www:www /var/tmp/
RUN mkdir -p /date
ADD start.sh /date
RUN chmod a+x /date/start.sh
RUN chown -R www:www /date/start.sh
RUN chmod -R 755 /var/tmp/
RUN sed -i 's/User apache/User www/g' /etc/httpd/conf/httpd.conf
RUN sed -i 's/Group apache/Group www/g' /etc/httpd/conf/httpd.conf
RUN sed -i 's/#ServerName www.example.com:80/ServerName localhost:8080/g' /etc/httpd/conf/httpd.conf
RUN sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf
USER 1911
ENTRYPOINT ["sh","/date/start.sh"]
  • 启动脚本start.sh编写
vi /date/start.sh
#!/bin/bash
/usr/sbin/httpd -D FOREGROUND
不加 -D FOREGROUND会报错别问我为什么知道的。因为这里我卡了很久。。。。
重启提示AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
  • 构建镜像使用docker命令
1.构建命令
docker build -f dockerfile -t httpjingxing:1.1.1 .
(还有个问题docker构建镜像镜像名不能大写会报错)
2.上传命令
docker push httpjingxing:1.1.1 

到此完结。。。。。。。。。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Java Docker API 构建 Docker 镜像,可以使用 `Dockerfile` 文件来定义构建步骤和镜像内容,然后使用 Docker Java 客户端提供的 `BuildImageCmd` 来构建镜像。以下是构建镜像的示例代码: ```java DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder().build(); DockerClient dockerClient = DockerClientBuilder.getInstance(config).build(); // 定义 Dockerfile 文件路径和构建上下文路径 String dockerfile = "/path/to/Dockerfile"; File buildContext = new File("/path/to/buildContext"); // 构建镜像 BuildImageResultCallback callback = new BuildImageResultCallback() { @Override public void onNext(BuildResponseItem item) { // 打印构建日志 System.out.println(item.getStream()); } }; dockerClient.buildImageCmd() .withDockerfile(new File(dockerfile)) .withBuildDirectory(buildContext) .exec(callback).awaitImageId(); ``` 在构建镜像时,需要指定 `Dockerfile` 文件路径和构建上下文路径。`Dockerfile` 文件用于定义构建步骤和镜像内容,构建上下文路径用于构建过程中需要的文件和目录。构建完成后,可以通过 `BuildImageResultCallback` 的 `awaitImageId()` 方法获取镜像 ID。 检查镜像是否构建成功,可以使用 `listImagesCmd` 方法获取当前主机上的所有镜像,然后查找构建镜像是否在列表中。以下是检查镜像是否构建成功的示例代码: ```java List<Image> images = dockerClient.listImagesCmd().exec(); for (Image image : images) { for (String tag : image.getRepoTags()) { if (tag.equals("image-name:tag")) { System.out.println("镜像构建成功!镜像 ID:" + image.getId()); return; } } } System.out.println("镜像构建失败!"); ``` 在 `listImagesCmd` 方法返回的镜像列表中,每个镜像都有一个或多个标签,可以通过标签来识别镜像。找到构建镜像后,可以获取其 ID 并打印出来,表示镜像构建成功。如果找不到构建镜像,则表示构建失败。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值