我尝试从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 "$@"
答案 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/);