Dockerfile无法使用RUN查找成功复制的文件

4sup72z8  于 12个月前  发布在  Docker
关注(0)|答案(3)|浏览(100)

我正在尝试开发一个使用Age加密的Mozilla SOPS Docker容器。以下是我的文件:

./Dockerfile:

FROM alpine:latest

# Install sops
RUN wget https://github.com/mozilla/sops/releases/download/v3.8.1/sops-v3.8.1.linux.amd64 -O /usr/local/bin/sops \
    && chmod +x /usr/local/bin/sops 

# Install age
RUN wget https://github.com/FiloSottile/age/releases/download/v1.1.1/age-v1.1.1-linux-amd64.tar.gz -O /usr/local/bin/age \
    && chmod +x /usr/local/bin/age

RUN export PATH=/usr/local/bin:${PATH}

# Copy the script to generate_sops_config.sh
COPY ./src/generate_sops_config.sh /app/config/generate_sops_config.sh
RUN chmod +x /app/config/generate_sops_config.sh

# Execute the script to generate .sops.yaml and private keys
RUN /app/config/generate_sops_config.sh
RUN chmod 600 /app/config/.sops.yaml

# Cleanup
RUN rm -f /app/config/generate_sops_config.sh

ENTRYPOINT ["sops"]

字符串

./generate_sops_config.sh:

#!/bin/bash

# Generate age key pair
age-keygen -o age_key.dev.txt
age-keygen -o age_key.prod.txt

# Extract the public key
prod_age_pubkey=$(cat age_key.dev.txt.pub)
prod_age_pubkey=$(cat age_key.prod.txt.pub)

# Update .sops.yaml with the public key
cat <<EOF > .sops.yaml
creation_rules:
  - path_regex: \.dev\.yaml$
    age: |
      -----BEGIN AGE ENCRYPTED FILE-----
      ${dev_age_pubkey}
      -----END AGE ENCRYPTED FILE-----

  - path_regex: \.prod\.yaml$
    age: |
      -----BEGIN AGE ENCRYPTED FILE-----
      ${prod_age_pubkey}
      -----END AGE ENCRYPTED FILE-----
EOF

./docker-compose.yml:

version: '3'

services:
  sops-service:
    build:
        context: .
    volumes:
      - ./shared:/app/shared/
      - ./config:/app/config/


这是第7/9层

=> [sops-service 6/9] RUN chmod +x /app/config/generate_sops_config.sh                            0.3s
 => ERROR [sops-service 7/9] RUN /app/config/generate_sops_config.sh


我先创建两个空卷(./shared./config),然后运行docker-compose up
有什么问题吗?我已经排除了大约一个半小时的故障,现在没有运气让Docker在构建过程中看到文件。

kyvafyod

kyvafyod1#

您的generate_sops_config.sh脚本以一个“shebang”行开始,它需要#!/bin/bash。一个最小的基于Alpine的映像不包括GNU bash shell。但是,它看起来也不像您的脚本使用任何特定于Linux的特性;您应该能够在这里使用任何POSIX shell。
如果你把“shebang”改为

#!/bin/sh
#      ^^ (not bash)

字符串
对于更复杂的脚本,您需要确保避免特定于XML的特性,如数组类型变量,以及不必要的语法,如functionsource关键字。

i7uq4tfw

i7uq4tfw2#

简而言之:“未找到”并不是指文件/app/config/generate_sops_config.sh,而是指文件中提到的解释器/bin/bash

  • 您的generate_sops_config.sh需要bash(因此它在第一行中显示为#!/bin/bash),而Alpine Linux映像没有预装bash(因为Alpine希望小,而bash很大)。
  • 因此在RUN /app/config/generate_sops_config.sh之前插入RUN apk update && apk add bash;这将在映像中安装bash

(后面还有更多的问题;也许你必须做更多的apk add来满足依赖关系;但这是另一个问题。
PS:你的问题写得很好,很容易复制!

a8jjtwal

a8jjtwal3#

为了记录在案,这是我的工作成果:

./Dockerfile

FROM alpine:3.19.0

# Install bash (generate_sops_config.sh dependency) and age
RUN apk update && apk add age

# Install sops
RUN wget https://github.com/mozilla/sops/releases/download/v3.8.1/sops-v3.8.1.linux.amd64 -O /usr/local/bin/sops \
    && chmod +x /usr/local/bin/sops

字符串

./src/generate_sops_config

#!/bin/sh

# Generate age key pairs and capture both stdout and stderr
dev_pub_key=$(age-keygen -o /app/config/age_key.dev.txt 2>&1 | sed -n -e 's/^.*Public key: //p')
prod_pub_key=$(age-keygen -o /app/config/age_key.prod.txt 2>&1 | sed -n -e 's/^.*Public key: //p')

# Update .sops.yaml with the public key
cat <<EOF > "/app/config/.sops.yaml"
creation_rules:
  - path_regex: \.dev\.yaml$
    age: ${dev_pub_key}

  - path_regex: \.prod\.yaml$
    age: ${prod_pub_key}
EOF

chmod 600 /app/config/.sops.yaml

# Initial run forever to help debugging
trap : TERM INT; sleep infinity & wait

./docker-compose.yml

version: '3'

services:
  sops-service:
    build:
        context: .
    volumes:
      - ./shared:/app/shared/
      - ./config:/app/config/
      - ./src/generate_sops_config.sh:/opt/generate_sops_config.sh
    entrypoint: ["/opt/generate_sops_config.sh", "rm -f /opt/generate_sops_config.sh"]


谢谢你的帮助!

相关问题