登录
首页 >  Golang >  Go问答

在容器中启动进程引发错误:exec:“air”:找不到命令

来源:stackoverflow

时间:2024-03-19 15:39:28 198浏览 收藏

新手在使用 docker-compose 容器化 go 应用程序时遇到错误,原因是 "air" 可执行文件在 $PATH 中找不到。该错误是由使用 exec 格式指定命令导致的,该格式在没有 shell 的情况下执行命令,导致环境变量不可用。解决方法是确保 "air" 是可执行文件,已交叉编译为 Linux,并已正确添加到 $PATH 中。

问题内容

我是码头工人的新手。我正在尝试使用 docker-compose 将我的 go 应用程序容器化。 使用的技术 golang、docker 20.10.8 和 air(用于实时重新加载)。 我的 dockerfile 如下所示。

from base as dev


workdir /opt/app/api

run apk update
run apk add git gcc musl-dev
run apk add curl

run curl -ssfl https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s -- -b $(go env gopath)/bin

# run go get
# run go mod tidy

cmd ["air"]

我的 docker-compose.yml 是这个。

version: "3.9"
services:
  app:
    build:
      dockerfile: Dockerfile.local
      context: .
      target: dev
    container_name: 'server'
    volumes:
      - .:/opt/app/api
    env_file:
      - .env      
    ports:
      - "8080:8080"
    restart:
      always    
    depends_on:
      - db
      - rabbitmq
  
  db:
    image: postgres:13-alpine
    volumes:
      - data:/var/lib/postgresql/data
    container_name: 'postgres'
    ports:
      - 5432:5432
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_HOST_AUTH_METHOD: trust
      POSTGRES_PASSWORD: postgres
  
  rabbitmq:
    image: rabbitmq:3-management-alpine
    container_name: 'rabbitmq'
    ports:
      - 5672:5672
      - 15672:15672
    volumes:
        - rabbitmq:/var/lib/rabbitmq
        - rabbitmq-log:/var/log/rabbitmq
  
  migrate: &basemigrate
    profiles: ["tools"]
    image: migrate/migrate
    entrypoint: "migrate -database postgresql://thursday:postgres@db/postgres?sslmode=disable -path /tmp/migrations"
    command: up
    depends_on:
      - db
    volumes:
    - ./migrations:/tmp/migrations
  
  create-migration:
    <<: *basemigrate
    entrypoint: migrate create -dir /tmp/migrations -ext sql
    command: ""
    depends_on:
      - db
  
  down-migration:
    <<: *basemigrate
    entrypoint: migrate -database postgresql://thursday:postgres@db/postgres?sslmode=disable -path /tmp/migrations
    command: down
    depends_on:
      - db
          
volumes: 
  data:
  rabbitmq:
  rabbitmq-log:

在运行命令sudo docker-compose up -d时,我收到以下错误

来自守护进程的错误响应:oci 运行时创建失败:container_linux.go:380: 启动容器进程导致:exec: "air": 在 $path 中找不到可执行文件:未知


正确答案


正如“docker: executable file not found in $PATH”中提到的:

当您对命令使用 exec 格式时(在您的情况下:CMD ["air"],带双引号的 JSON 数组),它将在没有 shell 的情况下执行。
这意味着大多数环境变量将不存在。

CMD air 应该可以工作,前提是:

  • air 是可执行文件 (chmod 755)
  • air 已交叉编译为 Linux(除非您运行 docker 的主机已经是 Linux)

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《在容器中启动进程引发错误:exec:“air”:找不到命令》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>