如何在容器中运行docker命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在容器中运行docker命令相关的知识,希望对你有一定的参考价值。

参考技术A 1. 安装 Docker
在开始前,我们首先得确保在Linux主机中已经安装了Docker。这里,我运行的是CentOS 7 主机,我们将运行yum管理器和下面的命令来安装Docker。
# yum install docker

# systemctl restart docker.service

2. 创建 Dockerfile
现在,Docker守护进程已经在运行中了,我们现在准备创建自己的Firefox Docker容器。我们要创建一个Dockerfile,在其中我们要输入需要的配置来创建一个可以工作的Firefox容器。为了运行 Docker 镜像我们需要使用最新版本的CentOS。要创建 Docker 镜像,我们需要用文本编辑器创建一个名为Dockerfile的文件。
# nano Dockerfile

接着,在Dockerfile中添加下面的行并保存。
#!/bin/bashFROM centos:7RUN yum install -y firefox# 用你自己的 uid /gid 替换下面的0RUN export uid=0 gid=0RUN mkdir -p /home/developerRUN echo "developer:x:$uid:$gid:Developer,,,:/home/developer:/bin/bash" >> /etc/passwdRUN echo "developer:x:$uid:" >> /etc/groupRUN echo "developer ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoersRUN chmod 0440 /etc/sudoersRUN chown $uid:$gid -R /home/developerUSER developerENV HOME /home/developerCMD /usr/bin/firefox

注意:在第四行的配置中,用你自己的用户和组id来替换0。 我们可以用下面的命令在shell或者终端中得到uid和gid。
参考技术B 交互式运行docker容器 [root@gage ~]#docker run -t -i ubuntu:14.04 /bin/bash root@89471dce598b:/# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr root@89471dce598b:/# pwd / root@89471dce598b:/# exit

我如何在Docker容器中运行npm命令?

[我正在尝试在docker容器中以开发模式运行一个有角度的应用程序,但是当我使用docker-compose build运行它时,它可以正常工作,但是当我尝试放置该容器时,出现以下错误:



ERROR: for sypgod  Cannot start service sypgod: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: "npm": executable file not found in $PATH

真正的问题是它无法识别npm服务,但是为什么呢?

设置将在下面:

Docker容器(Nginx反向代理-> Angular在端口4000中运行)

我知道有更好的部署方法,但是由于某些个人原因,目前我需要此设置

Dockerfile:


FROM node:10.9 


COPY package.json package-lock.json ./

RUN npm ci && mkdir /angular && mv ./node_modules ./angular

WORKDIR /angular

RUN npm install -g @angular/cli 

COPY . . 


FROM nginx:alpine
COPY toborFront.conf /etc/nginx/conf.d/
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
CMD ["npm", "serve", "--port 4000"]

NginxServerSite

server{
    listen 80;
    server_name sypgod;


    location / {
            proxy_read_timeout 5m;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://localhost:4000/;


    }

}


Docker Compose文件(我遇到问题的重要部分)

 sypgod: # The name of the service
        container_name: sypgod  # Container name
        build: 
            context: ../angular
            dockerfile: Dockerfile # Location of our Dockerfile


答案
似乎无法从容器中访问npm。尝试从以下位置定义它尝试执行的位置:

docker run -v "$PWD":/usr/src/app -w /usr/src/app node:10.9 npm serve --port 4000

来源:https://gist.github.com/ArtemGordinsky/b79ea473e8bc6f67943b

还要确保在运行Docker容器的计算机上安装了npm。

另一答案
您可以执行以下操作

### STAGE 1: Build ### # We label our stage as ‘builder’ FROM node:alpine as builder RUN apk --no-cache --virtual build-dependencies add git python make g++ RUN mkdir -p /ng-app/dist WORKDIR /ng-app COPY package.json package-lock.json ./ ## Storing node modules on a separate layer will prevent unnecessary npm installs at each build RUN npm install COPY . . ## Build the angular app in production mode and store the artifacts in dist folder RUN npm run ng build -- --prod --output-path=dist ### STAGE 2: Setup ### FROM nginx:1.14.1-alpine ## Copy our default nginx config COPY toborFront.conf /etc/nginx/conf.d/ ## Remove default nginx website RUN rm -rf "/usr/share/nginx/html/*" ## From ‘builder’ stage copy over the artifacts in dist folder to default nginx public folder COPY --from=builder /ng-app/dist /usr/share/nginx/html CMD ["nginx", "-g", "daemon off;"]

另一答案
最终运行的图像是这个:

FROM nginx:alpine COPY toborFront.conf /etc/nginx/conf.d/ EXPOSE 8080 CMD ["npm", "serve", "--port 4000"]

第一阶段没有任何作用(您可以从中删除COPY --from=...个文件),并且如果有多个CMD,则只有最后一个有作用。由于您是在普通的nginx图像中运行此命令,因此没有npm命令,导致出现错误。

我建议将主机上的Node用于实时开发环境。当您构建并测试了应用程序并打算对其进行部署时,请在适当的情况下使用Docker。在您的Dockerfile中,在第一阶段运行ng build将应用程序编译为静态文件,在第二阶段运行COPY --from=...以将已构建的应用程序放入Nginx映像,然后删除所有CMD行([C0 ]具有适当的默认值nginx)。 @VikramJakhar的CMD有一个更完整的Dockerfile显示了这一点。

看来您可能正在尝试在Docker中同时运行Nginx和Angular开发服务器。如果这是您的目标,则需要在两个单独的容器中运行它们。为此:

    将此Dockerfile拆分为两个。将answer行放在第一个(仅角度)Dockerfile的末尾。
  • CMD ["npm", "serve"]文件中添加第二个块以运行第二个容器。后端docker-compose.yml容器不需要发布npm serve
  • 将Nginx配置中的后端服务器的主机名从ports:更改为另一个容器的Docker Compose名称。

以上是关于如何在容器中运行docker命令的主要内容,如果未能解决你的问题,请参考以下文章

如何在 docker 容器内部运行 docker命令

如何在 docker 容器中运行 npm 命令?

如何在 docker 容器内部运行 docker命令

Docker - 如何在postgres容器中运行psql命令?

我如何在Docker容器中运行npm命令?

Kubernetes:如何从 Docker 容器 A 在 Docker 容器 B 上运行 Bash 命令