Docker Compose挂载卷后SSL生成脚本找不到,如何解决?
解决Docker挂载卷覆盖容器内脚本的问题
问题原因
当你通过volumes把本地./ssl目录挂载到容器的/ssl时,容器内原本通过COPY命令放到/ssl的generate_ssl.sh会被挂载的卷完全覆盖,导致脚本找不到。
解决方案
方案1:修改脚本存放路径,避免被挂载卷覆盖
调整Dockerfile,把脚本放到容器内非挂载目录(比如/app),生成的证书仍输出到挂载的/ssl目录:
# ssl_generator/Dockerfile FROM alpine:latest # Install openssl RUN apk add --no-cache openssl # 设置工作目录为挂载目录/ssl,确保证书生成到这里 WORKDIR /ssl # 把脚本复制到非挂载的/app目录 COPY generate_ssl.sh /app/generate_ssl.sh # 给脚本添加执行权限 RUN chmod +x /app/generate_ssl.sh # 运行脚本,生成的证书会直接写入当前工作目录/ssl(对应本地./ssl) ENTRYPOINT ["/bin/sh", "-c", "/app/generate_ssl.sh && sleep 10"]
挂载./ssl:/ssl后,脚本在/app不会被覆盖,执行时生成的证书会自动同步到本地目录。
方案2:一次性生成证书后复制到本地(适合临时场景)
如果只是需要一次性生成证书,可以先跳过挂载卷,生成后再复制到本地:
- 临时注释docker-compose.yml里的volumes配置:
version: '3.8' services: ssl_generator: build: context: ./ssl_generator # volumes: # - ./ssl:/ssl
- 启动容器生成证书:
docker compose up - 把容器内的证书复制到本地:
docker cp projekt-ssl_generator-1:/ssl ./(容器名根据实际运行结果调整) - 恢复volumes配置,后续可直接使用本地证书。
方案3:使用Init容器生成证书(适合长期部署)
如果需要每次启动都确保证书存在,可借助Init容器先生成证书到命名卷,再供主服务使用:
version: '3.8' # 创建命名卷存储证书 volumes: ssl_certs: services: ssl_generator: build: context: ./ssl_generator volumes: - ssl_certs:/ssl # 修改ENTRYPOINT,生成证书后直接退出 entrypoint: ["/app/generate_ssl.sh"] # 你的主服务,挂载证书卷使用 your_main_service: image: your-target-image volumes: - ssl_certs:/path/to/ssl/folder depends_on: ssl_generator: condition: service_completed_successfully
同时配合方案1的Dockerfile修改(脚本放到/app),这样证书会存到命名卷中,不会被本地目录覆盖,主服务可直接读取使用。
内容的提问来源于stack exchange,提问作者Andrii Sukhoi
相关产品推荐
相关产品推荐

