在Dockerfiles和docker-compose.yml之间同步数字用户ID?

我有一个docker – 撰写新手的问题。 我们有一个现有的Jenkins构build,可以创buildDocker镜像,并将它们推送到内部的Artifactory存储库。 这是通过使用Maven / Docker和两个Dockerfiles(一个用于应用程序,另一个用于卷/数据容器)驱动的。 Dockerfiles看起来像这样:

应用程序:

FROM centos RUN useradd -u 6666 -ms /bin/bash foouser COPY src/main/resources/home/foouser/.bashrc /home/foouser/ RUN chown -R foouser:foouser /home/foouser USER foouser COPY src/main/resources/opt/myapp/bin/startup.sh /opt/myapp/bin/ WORKDIR /home/foouser ENTRYPOINT /opt/myapp/bin/startup.sh && /bin/bash 

数据容器:

 FROM centos # Environment variable for the path to mount/create. Defaults to /opt/data ENV DATA_VOL_PATH="/opt/data" # Make sure the user id is the same as the container using the volume, otherwise we may run into permission issues on # the container mounting the volume. RUN useradd -u 6666 -ms /bin/bash foouser && \ mkdir -p "$DATA_VOL_PATH" && \ chown -R foouser:foouser "$DATA_VOL_PATH" VOLUME [ "$DATA_VOL_PATH" ] 

为了简洁起见,我省略了标签等内容。 所以从这些Docker文件生成的图像将最终在本地的Artifactory回购。 我们使用Rancher / Cattle来实例化这些图像,并且我已经向Rancher添加了Artifactory回购,因此可以从那里拉出。 Rancher中的docker-compose.yml文件如下所示:

 # The data/volumes container for the data. data: image: data-image # App myapp: image: app-image environment: DATA_VOL_PATH: volumes_from: - data 

我知道我可以从docker-compose传递环境variables(如上面的DATA_VOL_PATH),但我很困惑如何工作。 我的理解是Dockerfile中的命令是在我运行docker build的时候执行的,在这之后,图像是不可变的。 当我基于图像实例化一个容器时,如果我正确地理解了东西,它会在它的顶部创build一个新的可写的UFS层。 所以在数据容器的情况下,一旦创build就不能真正改变音量,对吗? 如果这个假设是正确的,则归结为:1)如何最好地在两个不同的系统(Maven创buildDocker镜像,Rancher实例化容器集群)上同步用户ID,2)是否更好地创build数据卷容器完全来自docker-compose.yml? 然后,我将如何能够复制docker-compose.yml中的数据容器的Dockerfile内容?

我认为这是一个相当普遍的情况,所以在那里必须有一些“最佳实践”解决scheme。 谢谢。

我也遇到了这个问题:在我的情况下,在Docker容器中有一个非root进程,这个进程需要访问从主机挂载的文件,所以我不得不注意Docker镜像中的UID / GID值和主机。

恐怕没有好的决定。 Docker镜像真的是不可变的,所以你必须build立一些协议或使用第三方软件来控制构build和部署过程。

我也强烈build议你停止使用SaltStack docker-compose并尝试SaltStack