Docker运行<image>总是在standard_init_linux.go:207上出错:exec用户进程在Windows上导致“没有这样的文件或目录”

时间:2019-07-04 02:04:23

标签: docker

我尝试从Dockerfile中执行docker-compose up,但是失败,并显示错误standard_init_linux.go:207: exec user process caused "no such file or directory"

我已经尝试了一切,包括重新安装docker,但似乎不起作用。

docker-compose.yml:

version: "3"

volumes:
  postgres_data:
    driver: local
  bundle_cache:
    driver: local

services:
  postgres:
    image: postgres:11
    volumes:
      - postgres_data:/var/lib/postgresql/data
    logging:
      driver: "none"
    ports:
      - "${POSTGRES_PORT}:5432"

  web-tracking:
    build:
      context: .
    tty: true
    stdin_open: true
    env_file:
      - ./.env
    depends_on:
      - postgres
    links:
      - postgres
    ports:
      - "${RAILS_PORT}:3000"
    volumes:
      - ./:/app:delegated
      - bundle_cache:/bundle

Dockerfile:

FROM ruby:2.6.3

EXPOSE 3000
WORKDIR ./app

RUN \
  apt-get update -qq && \
  apt-get install -y --no-install-recommends \
  nodejs \
  postgresql-client

ENV BUNDLE_PATH=/bundle \
  BUNDLE_BIN=/bundle/bin \
  GEM_HOME=/bundle
ENV PATH="${BUNDLE_BIN}:${PATH}"

COPY docker-entry.sh .

ENTRYPOINT ["/app/docker-entry.sh"]
CMD ["rails", "server", "-b", "0.0.0.0"]

docker-entry.sh

#!/bin/sh
set -e

# if the server was not shut down properly the pid file will need to be removed
if [ -f tmp/pids/server.pid ]; then
  rm tmp/pids/server.pid
fi
bundle install
bundle exec "$@"

2 个答案:

答案 0 :(得分:0)

根本原因是docker-entry.sh,您在Windows上设置了此文件。在Windows上,换行器为\r\n,而最终在Linux容器中运行时,换行器为\n

因此,您应该输入类似git-bash的内容,然后执行dos2unix docker-entry.sh来更改格式,然后重新生成并重新运行它,就可以了。

另一种解决方案是在构建Dockerfile并更改其格式时安装dos2unix,就像接下来的操作(您可能还需要更改其权限):

FROM ruby:2.6.3

EXPOSE 3000
WORKDIR ./app

RUN \
  apt-get update -qq && \
  apt-get install -y --no-install-recommends \
  nodejs \
  postgresql-client \
  dos2unix

ENV BUNDLE_PATH=/bundle \
  BUNDLE_BIN=/bundle/bin \
  GEM_HOME=/bundle
ENV PATH="${BUNDLE_BIN}:${PATH}"

COPY docker-entry.sh .
RUN dos2unix ./docker-entry.sh && chmod 777 ./docker-entry.sh

ENTRYPOINT ["/app/docker-entry.sh"]
CMD ["rails", "server", "-b", "0.0.0.0"]

答案 1 :(得分:0)

我在Ubuntu 16.04上没有问题地运行您的堆栈。如果您在Windows上运行,则可能需要使用dos2unix来运行docker-entry.sh脚本(https://forums.docker.com/t/standard-init-linux-go-175-exec-user-process-caused-no-such-file/20025

当我开始使用docker时,我第一次尝试使用docker-compose。 因此,我意识到这对我来说学习docker和docker-compose非常困难 因为您迷失了命令和配置的混乱局面。 首先,我为您推荐,尝试仅使用Dockerfile并连接“ postgres”和“ web-tracking” 具有docker网络的容器,称为“用户定义的桥”(https://docs.docker.com/network/bridge/);