在docker compose中使用.sh文件构建镜像

问题描述 投票:0回答:1

我有一个 docker compose 文件,可以在我的 Windows/WSL 环境中正常工作。我正在尝试将其部署到 Ubuntu 服务器。我收到以下错误

unable to prepare context: path "/home/dev/gestion_energetique/portainer/node_red/docker-alpine.sh

该镜像是使用 docker-alpine.sh 脚本构建的。该文件在那里并且具有所有权限(777)。我见过类似的问题,但没有人帮助我解决这个问题。我假设问题是 .sh 脚本,但我不知道如何解决这个问题。

如有任何帮助,我们将不胜感激。

这是我使用的文件

撰写文件:

services:
  nodered:
    container_name: nodered
    image: testing:node-red-build
    build: /home/dev/gestion_energetique/portainer/node_red/docker-alpine.sh
    restart: always
    ports:
      - 1880:1880
    # volumes:
    #   - ~/node_red/:/data/
  influxdb:
    container_name: influxdb
    image: influxdb:latest
    restart: always
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup 
      - DOCKER_INFLUXDB_INIT_USERNAME=${INFLUXDB_USERNAME}
      - DOCKER_INFLUXDB_INIT_PASSWORD=${INFLUXDB_PASSWORD}
      - DOCKER_INFLUXDB_INIT_ORG=${INFLUXDB_ORG}
      - DOCKER_INFLUXDB_INIT_BUCKET=${INFLUXDB_BUCKET}
      - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=${INFLUXDB_TOKEN}
    volumes:
      - /home/dev/gestion_energetique/portainer/data:/var/lib/influxdb2
      - /home/dev/gestion_energetique/portainer/config/influxdb:/etc/influxdb2
    ports:
      - 8086:8086
    depends_on:
      - nodered
  grafana:
    container_name: grafana
    image: grafana/grafana:latest
    restart: always
    ports:
      - 3000:3000
    volumes:
      - /home/dev/gestion_energetique/portainer/data/grafana:/var/lib/grafana
      - /home/dev/gestion_energetique/portainer/config/grafana:/etc/grafana
    depends_on:
      - influxdb
  ihm:
    container_name: ihm
    build: /home/dev/gestion_energetique/portainer/.
    restart: always
    ports:
      - 1312:1312
    depends_on:
      - influxdb

docker-alpine.sh

#!/bin/bash
export NODE_RED_VERSION=$(grep -oE "\"node-red\": \"(\w*.\w*.\w*.\w*.\w*.)" package.json | cut -d\" -f4)

echo "#########################################################################"
echo "node-red version: ${NODE_RED_VERSION}"
echo "#########################################################################"

docker build --rm --no-cache \
    --build-arg ARCH=amd64 \
    --build-arg NODE_VERSION=20 \
    --build-arg NODE_RED_VERSION=${NODE_RED_VERSION} \
    --build-arg OS=alpine \
    --build-arg BUILD_DATE="$(date +"%Y-%m-%dT%H:%M:%SZ")" \
    --build-arg TAG_SUFFIX=default \
    --file Dockerfile.custom \
    --tag testing:node-red-build .

谢谢你!

docker docker-compose dockerfile sh
1个回答
0
投票

根据 Compose 规范,如果

build:
是一个字符串,那么它要么是包含构建上下文的 directory,要么是指向
directory
git://... URL。 同一文档指出,Compose“执行 Docker 构建,在目录的根目录中查找规范的
Dockerfile
”。

Compose 不会运行任意 shell 脚本,实际上您应该会收到类似“构建上下文不是目录”的错误。

看起来该脚本中的内容主要是试图提供构建时参数。 那些是静态的或只是通过主机环境变量,您可以将其包含在 Compose 文件中

services:
  nodered:
    build:
      context: .
      dockerfile: Dockerfile.custom  # consider just "Dockerfile"
      args:
        ARCH: amd64                  # consider automatic `$TARGETARCH`
        NODE_VERSION: "20"
        NODE_RED_VERSION:            # intentionally empty to pass through from host
        OS: alpine
    image: testing:node-red-build    # optional if you're not pushing this image anywhere

唯一剩下的变量是构建日期。 您没有说明它在 Dockerfile 中的使用方式,但您应该能够在 Dockerfile 内实际使用该值的

date
指令中运行相同的
RUN
命令。

© www.soinside.com 2019 - 2024. All rights reserved.