我有以下Dockerfile:

FROM ubuntu

ENV NPM_CONFIG_LOGLEVEL warn
ENV admin_user="PeerAdmin" network_name=$1 version=$2 hversion=hlfv1     fabrik_path=/fabric-tools project_dir=$(pwd)
ENV card_store_dir=$project_dir/.card-store stage_dir=$project_dir/.stage     env_dir=$project_dir/env is_ok=1 FABRIC_VERSION=hlfv1

WORKDIR /app
COPY . /app

USER root
# RUN chown -R ubuntu:ubuntu .
WORKDIR /app
RUN apt-get update && \
    mkdir "$fabrik_path" && \
    cd "$fabrik_path" && \
    export FABRIC_VERSION=hlfv1 && \
    apt-get -y install apt-transport-https ca-certificates curl software-properties-common && \
    apt-get -y install curl && \
    apt-get -y install unzip && \
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - && \
    apt-get -y install docker.io && \
    curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.zip && \
    unzip fabric-dev-servers.zip && \
    service docker start && \
    ./downloadFabric.sh && \
    ./startFabric.sh

尝试执行它,我收到一个错误:
**Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?**
service docker start或systemctl这样的命令不起作用。

最佳答案

您不能(*)在Docker容器或镜像中运行Docker。您不能(*)在Dockerfile中启动后台服务。就像您说的那样,诸如systemctlservice的命令在任何地方都无法在Docker内部运行。而且无论如何,您都无法从Dockerfile中的任何位置使用任何主机系统资源,包括主机的Docker套接字。

您需要重新设计此Dockerfile,使其仅安装软件,而不会尝试启动它。理想情况下,容器只能启动一台服务器,并将其作为CMD在前台运行;否则,如果需要,您可能依赖supervisord之类的东西来拥有多个服务器。如果您的应用程序严重依赖于能够在Docker中启动功能,则可能会发现在虚拟机中安装起来要容易得多。

(*)从技术上讲,有很多方法可以完成所有这些操作,但是它们都很棘手,复杂并且会产生影响(可能会给您的容器提供对主机的不受限制的根访问权限,并且您的容器启动会积极地重新配置一些低级主机细节)。

10-02 22:31