当前位置: 首页 > 知识库问答 >
问题:

无法使用Dockerfile写入目录

微生昌胤
2023-03-14

我有下面的Dockerfile。我试图用--build参数重建图像和docker compose。我看到它经历了包括重新创建证书在内的步骤,但它不会将其写入目录。该目录归root所有,root拥有对其的完全访问权限。我也在运行docker compose。这是/var/lib/docker/volumes上的挂载目录。存在/etc/apache2/certificate目录。我错过了什么?

--DockerFile
    FROM php:7.4.3-apache
    RUN apt-get update -y && apt-get install -y apt-utils libhtml-template-pro-perl default-mysql-client libtemplate-perl openssl
    RUN docker-php-ext-install mysqli pdo pdo_mysql && docker-php-ext-enable pdo_mysql
    RUN a2enmod ssl
    RUN a2enmod rewrite
    WORKDIR /etc/apache2/certificate
    RUN touch testing_before.txt
    RUN openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out apache-certificate.crt -keyout apache.key -subj "/C=US/ST=GA/L=Atlanta/O=Companyabc/CN=`hostname -f`"
    RUN touch testing_after.txt
    RUN service apache2 restart

---Docker-compose
---
version: "3.7"
services:
  web:
    build: ./apache 
    container_name: apache
    restart: unless-stopped
    volumes:
      - web-data:/var/www/html
      - web-conf:/etc/apache2
    ports:
      - "80:80"
      - "443:443"
volumes:
  web-data:
  web-conf:

共有1个答案

毛博
2023-03-14

运行openssl req-new-newkey rsa: 4096-x509-sha256天365个节点apache-certificate.crt-keyoutapache.key-subj"/C=US/ST=GA/L=亚特兰大/O=Companyabc/CN=host name-f"

在大多数情况下,在构建阶段设置主机名是没有意义的,通过在RUN命令中设置主机名,就像使用apt get安装软件包一样,它发生在容器的同一层中。Docker守护进程在运行时动态设置主机名时,Docker稍后将覆盖主机名。

下面可能是您可以在Dockerfile

# base image
FROM php:7.4.3-apache

# your other packages & extensions goes here
# .....

# ports you expose here
EXPOSE 80
EXPOSE 443

# override your entrypoint with new script
ADD docker-entrypoint.sh /

# make it executable
RUN chmod a+x /docker-entrypoint.sh

# your new entry point override
ENTRYPOINT ["/docker-entrypoint.sh"]

# we're using original apache2-foreground script

CMD ["apache2-foreground"]

并创建docker入口点。sh

#!/bin/sh
set -e

# if you have some more task put here
# example configuration customisation etc..

# certificate directory
mkdir -p /etc/apache2/certificate

if [ ! -f "/etc/apache2/certificate/apache-certificate.crt" ] || [ ! -f "/etc/apache2/certificate/apache.key" ]; then
  echo ">> generating self signed cert"
  openssl req -x509 -newkey rsa:4096 \
  -subj "/C=US/ST=GA/L=Atlanta/O=Companyabc/CN=`hostname -f`" \
  -keyout "/etc/apache2/certificate/apache.key" \
  -out "/etc/apache2/certificate/apache-certificate.crt" \
  -days 365 -nodes -sha256
 
fi

# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
    set -- apache2-foreground "$@"
fi

exec "$@"

您可以在这里参考原始入口点

您可以在Web服务容器中设置主机名

version: "3.7"
services:
  web:
    build: ./apache 
    container_name: apache
    hostname: web-server.mydomain.com
    restart: unless-stopped
    volumes:
      - web-data:/var/www/html
      - web-conf:/etc/apache2
    ports:
      - "80:80"
      - "443:443"
volumes:
  web-data:
  web-conf:

测试结果:

root@sys:/home/akshay/Documents/test# tree 
.
├── apache
│   ├── docker-entrypoint.sh
│   └── Dockerfile
└── docker-compose.yml

1 directory, 3 files
root@sys:/home/akshay/Documents/test# docker-compose up -d --build
Building web
Step 1/7 : FROM php:7.4.3-apache
 ---> d753d5b380a1
Step 2/7 : EXPOSE 80
 ---> Using cache
 ---> 66c155b818cc
Step 3/7 : EXPOSE 443
 ---> Using cache
 ---> 141789b7ce40
Step 4/7 : ADD docker-entrypoint.sh /
 ---> Using cache
 ---> 0fd8d03fb8ec
Step 5/7 : RUN chmod a+x /docker-entrypoint.sh
 ---> Using cache
 ---> 9a081cf61816
Step 6/7 : ENTRYPOINT ["/docker-entrypoint.sh"]
 ---> Using cache
 ---> 22b1851f7882
Step 7/7 : CMD ["apache2-foreground"]
 ---> Using cache
 ---> 46c5cf7c6630

Successfully built 46c5cf7c6630
Successfully tagged test_web:latest
apache is up-to-date

root@sys:/home/akshay/Documents/test# docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                                                                      NAMES
20a2af0e0570   test_web   "/docker-entrypoint.…"   50 seconds ago   Up 48 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   apache

root@web-server:/var/www/html# ls /etc/apache2/certificate/ -1
apache-certificate.crt
apache.key

root@web-server:/var/www/html# openssl x509 -in /etc/apache2/certificate/apache-certificate.crt -text | head -15
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            5f:b9:28:da:06:53:12:64:c3:e5:1c:90:5d:9e:18:f5:f2:1f:2c:eb
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = GA, L = Atlanta, O = Companyabc, CN = web-server.mydomain.com
        Validity
            Not Before: May 26 16:45:25 2021 GMT
            Not After : May 26 16:45:25 2022 GMT
        Subject: C = US, ST = GA, L = Atlanta, O = Companyabc, CN = web-server.mydomain.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:

确保证书的有效性

root@sys:/home/akshay/Documents/test# docker-compose up -d  --force-recreate
Recreating apache ... done
root@sys:/home/akshay/Documents/test# docker exec -it apache bash
root@web-server:/var/www/html#  openssl x509 -in /etc/apache2/certificate/apache-certificate.crt -text | head -15
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            43:1a:6d:c1:af:bc:05:54:58:04:f7:d2:42:d7:92:5f:ef:dc:a6:20
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = GA, L = Atlanta, O = Companyabc, CN = web-server.mydomain.com
        Validity
            Not Before: May 26 16:53:34 2021 GMT
            Not After : May 26 16:53:34 2022 GMT
        Subject: C = US, ST = GA, L = Atlanta, O = Companyabc, CN = web-server.mydomain.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:

 类似资料:
  • 我正在尝试将json文件转换为csv文件。json文件来自tweepy。 但是当我打印它的时候,它起作用了。当我只写时,它就起作用了。 我是一个新手在Python和twepy。但是我的直觉告诉我,这个问题与json文件本身有关。 这是json文件本身: 另一个错误: Traceback(最近一次调用):文件"C:\用户\用户\桌面\fase 1-20170930T062552Z-001\trans

  • 我无法在缓存目录中写入文件 使用context.filesdir(但不使用context.cachedir)可以很好地工作。我正在使用libaums库读取USB文件。

  • 我有一个包含String[]和Time[]数组列的表。从桌子上看书很好。但当我想创造一张唱片的时候... null

  • 问题内容: 直到几天前,它仍能正常工作,而当我今天再次尝试构建它时,终端中出现以下错误。我尝试使用多个docker基本映像,但仍给出相同的错误。谁能帮我这个?我不认为我错过了任何东西。如果我错过了,应该早点给我错误,但是现在为什么呢? 而我的docker版本是 这是我的 问题答案: 我刚刚更改了VM Player网络设置。从更改为。现在工作了

  • Docker 为我们提供了 Dockerfile 来解决自动化的问题。我们将介绍什么是 Dockerfile,它能够做到的事情以及 Dockerfile 的一些基本语法。 Dockerfile 的语法规则 Dockerfile 包含创建镜像所需要的全部指令。基于在 Dockerfile 中的指令,我们可以使用 Docker build 命令来创建镜像。通过减少镜像和容器的创建过程来简化部署。 Do

  • 我正在Servlet 3.0和Tomcat中做一个简单的演示项目 我接受邮递员的JSON请求并提供JSON响应。 现在我也想在我的项目中做日志记录。 所以我使用log4j2 罐子使用:- log4j-1.2.12.jar, jackson-databind-2.6.3.jar, jackson-core-2.6.3.jar Servlet代码:- 我的项目目录:- 我的log4j。xml 当我在e