Docker为linux Debian和Arch编写文件

Docker为linux Debian和Arch编写文件,linux,docker,docker-compose,Linux,Docker,Docker Compose,希望我做得对 首先,我们使用docker compose和一个yml文件 看起来像这样: sudo docker-compose-f docker-compose.yml up-d 在yml文件中,我们有类似的内容: version: '3.4' services: MyContainer: image: "MyContainer:latest" container_name: MyContainer restart: always environment:

希望我做得对

首先,我们使用docker compose和一个yml文件
看起来像这样:

sudo docker-compose-f docker-compose.yml up-d

在yml文件中,我们有类似的内容:

version: '3.4'
services:
  MyContainer:
    image: "MyContainer:latest"
    container_name: MyContainer
    restart: always
    environment:
        - DISPLAY=unix$DISPLAY
        - QT_X11_NO_MITSHM=1
    devices:
        - /dev/dri:/dev/dri
    volumes:
        - /tmp/.X11-unix:/tmp/.X11-unix:rw
        - /dev/dri:/dev/dri
        - /usr/lib/x86_64-linux-gnu/libXv.so.1:/usr/lib/x86_64-linux-gnu/libXv.so.1:rw
        - ~/MyFiles/:/root/Myfiles
        - ~:/root/home
现在问题开始了。我们团队使用了两种操作系统。一次是Ubuntu,然后是Arch和Manjaro。经验丰富的Linux用户可能知道,这在Arch上不起作用。因为x86_64-linux-gnu是Ubuntu中的一个文件夹。这是Debian/Ubuntu系统上一个非常特殊的文件夹。Arch/Manjaro和几乎所有其他Linux发行版上的等效版本是/usr/lib或/usr/lib64

当然,黑客会把这个文件夹链接到lib中,但我不想让每一个没有Ubuntu的新团队成员/机器都这样做

所以这些都是要提供的前期信息。 我的问题是:

您认为解决此问题的最佳方法是什么?

我有一个谷歌搜索,但要么我使用了错误的关键字,要么人们没有这个问题,因为他们设计的容器更智能

我知道可以创建docker卷,然后在docker compose文件中使用,但为此,我们需要在所有PC、笔记本电脑和服务器上重新运行安装程序,如果可能的话,希望避免这种情况

我有很多东西要学,所以如果你有更多的经验和知识,请很好地解释我的错误

问候,,
docker compose中的Stefan

卷部分支持环境变量。您可以利用它,它将是特定于机器的。

如果您试图使用主机显示、主机库、主机文件系统和主机硬件设备,那么Docker唯一能让您感到不方便的是一个需要root权限才能运行的打包机制。构建二进制文件并直接在主机上运行应用程序要容易得多

如果必须在Docker中运行此操作,则映像应该是自包含的:运行应用程序所需的所有代码和库都必须位于映像中,并复制到
Dockerfile
中。大多数映像都是从一些Linux发行版(可能间接通过语言运行时)开始的
,因此您需要使用其包管理器安装所需的库

FROM ubuntu:18.04
RUN apt-get update \
 && apt-get install --no-install-recommends --assume-yes \
      libxv1
...

将二进制文件或库绑定到容器中不仅会导致您描述的文件系统不一致,在某些情况下还会导致二进制兼容性问题。例如,绑定装载在MacOS主机上无法正常工作。(早期在Docker容器中使用Docker套接字的方法建议将
/usr/bin/Docker
绑定到容器中,但如果CentOS主机Docker是针对不同于Ubuntu容器Docker的共享库构建的,则可能会出现问题。)

感谢您的澄清!我需要和第一手制作docker文件的人谈谈,以改变这种情况,但据我所知,这将是最好的方法。当我这么做的时候,我会把它标记为答案。