请考虑以下典型的python
项目结构:
fooproject
- main.py
- src/
- test/
- logs/
- Dockerfile
- .dockerignore
- README.md
。dockerfile应该防止test/
和logs/
目录包含在Docker映像中。
test/
logs/
Dockerfile
的内容是
FROM ubuntu16.04
COPY . /app/
WORKDIR /app
USER root
RUN pip install -r requirements.txt
ENTRYPOINT ["main.py"]
但是,当通过PyCharm的自动docker集成运行时,test
和logs
目录都被复制到了容器中。 PyCharm运行命令最终如下所示:
7eb643d9785b:python -u /opt/project/main.py
我尝试了一些无济于事的事情,例如在应用程序其余部分上方的目录中复制.dockerignore
的副本。例如:
COPY . /app/
COPY .dockerignore .dockerignore
WORKDIR /app
想知道PyCharm的/opt/project
是否有某种干扰?因此。dockerignore应该在哪里在这样的项目中?
@@ BMitch建议发布docker container inspect <container name>
的输出
[
{
"Id": "3f9effbb2e0bd0768fa692ba1665fa78f3b8974af3963f137f40e56a13353dd2",
"Created": "2020-03-17T15:08:31.438279494Z",
"Path": "python",
"Args": [
"-u",
"/opt/project/grimlock.py"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 5942,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-03-17T15:08:33.026867235Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:ab427a5dcb775ada4aa911eab240d6e2b20372374cc8b91cec699e878e14e25c",
"ResolvConfPath": "/var/lib/docker/containers/3f9effbb2e0bd0768fa692ba1665fa78f3b8974af3963f137f40e56a13353dd2/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/3f9effbb2e0bd0768fa692ba1665fa78f3b8974af3963f137f40e56a13353dd2/hostname",
"HostsPath": "/var/lib/docker/containers/3f9effbb2e0bd0768fa692ba1665fa78f3b8974af3963f137f40e56a13353dd2/hosts",
"LogPath": "/var/lib/docker/containers/3f9effbb2e0bd0768fa692ba1665fa78f3b8974af3963f137f40e56a13353dd2/3f9effbb2e0bd0768fa692ba1665fa78f3b8974af3963f137f40e56a13353dd2-json.log",
"Name": "/musing_borg",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "docker-default",
"ExecIDs": null,
"HostConfig": {
"Binds": [
"/home/adam/Desktop/Dev/ec2-data-analysis/grimlock:/opt/project:rw"
],
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "bridge",
"PortBindings": null,
"RestartPolicy": {
"Name": "",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": [
"5989fd4331f3fddb73ded0832c214fe8f835427bade88a6d9eb8525c7b17d45a:rw"
],
"CapAdd": null,
"CapDrop": null,
"Capabilities": null,
"Dns": null,
"DnsOptions": null,
"DnsSearch": null,
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "shareable",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": null,
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": null,
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/634ab0ba20ff1c85dec4891de5f2b80f36603182f4863a451182e7f1f0f87b6d-init/diff:/var/lib/docker/overlay2/5f38e55c21502c4b7530406b90b7e0de8c5ad32060d808caea01f2f45c3e1f6d/diff:/var/lib/docker/overlay2/be43c43e429bf90d6a714e2076b18a7e28bc668bcd20652381c9b64ef74c79ca/diff:/var/lib/docker/overlay2/a7180c7e01ecc97ded4664495c9de2a777ebc8cc0dc3a1910fd318fbd25fea40/diff:/var/lib/docker/overlay2/eb43fe827644d365555771aae1272435950b8c1dc0be86a2a0bfd47b2b9d0bd2/diff:/var/lib/docker/overlay2/6c05d16e4be3c9f8c5a7ad5bb276d243d83e870a96e849c57999f43a6f0b021e/diff:/var/lib/docker/overlay2/4a4c9c52a974b4a3a6434bd36810cb6a268092affde7c99e8226bc73ae859575/diff:/var/lib/docker/overlay2/8377b09fd2aedfc6ce1f530050067bc00614444bde70fa80b3e189a838b624f9/diff:/var/lib/docker/overlay2/d450e166a89cf6d0ae0cdccb164de608e520e948d901e5a4ec6381ee5c624e43/diff:/var/lib/docker/overlay2/16c9d3051df305716a8f1c9e187679040a7c897a17987b7721dca7b238f6c8c3/diff:/var/lib/docker/overlay2/d4f536a71c9c77b1be8b334cc237cb421fdef9151a0a497ab3f27ccac35f538c/diff:/var/lib/docker/overlay2/ecf4e19baabb106cc99acde43fb3aaea8f2544c7115c54851f8b13c736f17b91/diff:/var/lib/docker/overlay2/60ef1d11eccba00362b48534bfe1931d69304b590a4d9a9a0edf55f5c3731e6b/diff:/var/lib/docker/overlay2/ff7d5e6ffbaed26a3e61058d07234847fb6307d5079887b4930584bc29957a9c/diff:/var/lib/docker/overlay2/b824b2dec49a05132b37b4dcc74eea2828af14cd8a8a1566b4453639bc691c6a/diff:/var/lib/docker/overlay2/ff97b15aae3c9a5bbe136caf898567e3b1e99f69981ee211e323d37bdd5d136e/diff:/var/lib/docker/overlay2/60dd623cd2b162dcfdd589b242c93549bd3d64c415925f6185f20dcd8d482646/diff:/var/lib/docker/overlay2/5670f6d3e57c0105d5cc5e90efda07c93cb503cdf8c352572a254c0805aeb4c9/diff:/var/lib/docker/overlay2/b4da6e9f680a97514c1799ca2d76e2c000af49bb0ec399120b1162a747efa761/diff:/var/lib/docker/overlay2/6cd105d5d2882cae1f1263c1b02582959ad4348e9063a5aa957e626b2fc4fd3a/diff:/var/lib/docker/overlay2/0b4ec550ae1b0d58e98068cc76f825fc08667f97c8d82028a9f77b1161ea48cf/diff:/var/lib/docker/overlay2/d897eaf7f43a62dc816e6752048c40b30555ddd44c401e6368ab5a7d2f53b015/diff",
"MergedDir": "/var/lib/docker/overlay2/634ab0ba20ff1c85dec4891de5f2b80f36603182f4863a451182e7f1f0f87b6d/merged",
"UpperDir": "/var/lib/docker/overlay2/634ab0ba20ff1c85dec4891de5f2b80f36603182f4863a451182e7f1f0f87b6d/diff",
"WorkDir": "/var/lib/docker/overlay2/634ab0ba20ff1c85dec4891de5f2b80f36603182f4863a451182e7f1f0f87b6d/work"
},
"Name": "overlay2"
},
"Mounts": [
{
"Type": "bind",
"Source": "/home/adam/Desktop/Dev/ec2-data-analysis/grimlock",
"Destination": "/opt/project",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "volume",
"Name": "918611aeb72dc7436c75ef570888c0eabd42d97f6e07ecc82fa613345d058818",
"Source": "/var/lib/docker/volumes/918611aeb72dc7436c75ef570888c0eabd42d97f6e07ecc82fa613345d058818/_data",
"Destination": "/opt/.pycharm_helpers",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
"Config": {
"Hostname": "3f9effbb2e0b",
"Domainname": "",
"User": "root",
"AttachStdin": true,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": true,
"StdinOnce": false,
"Env": [
"PYTHONPATH=/opt/project:/opt/.pycharm_helpers/pycharm_matplotlib_backend:/opt/.pycharm_helpers/pycharm_display",
"FLASK_ENV=development",
"AWS_SECRET_ACCESS_KEY=*****",
"PYCHARM_HOSTED=1",
"JETBRAINS_REMOTE_RUN=1",
"PYTHONIOENCODING=UTF-8",
"PYCHARM_DISPLAY_PORT=63342",
"AWS_SECRET=***",
"AWS_DEFAULT_REGION=us-east-2",
"AWS_ACCESS_KEY_ID=*****",
"PYTHONUNBUFFERED=1",
"PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LANG=C.UTF-8",
"GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D",
"PYTHON_VERSION=3.6.9",
"PYTHON_PIP_VERSION=19.3.1",
"PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/ffe826207a010164265d9cc807978e3604d18ca0/get-pip.py",
"PYTHON_GET_PIP_SHA256=b86f36cc4345ae87bfd4f10ef6b2dbfa7a872fbff70608a1e43944d283fd0eee"
],
"Cmd": [
"python",
"-u",
"/opt/project/grimlock.py"
],
"Image": "sha256:ab427a5dcb775ada4aa911eab240d6e2b20372374cc8b91cec699e878e14e25c",
"Volumes": null,
"WorkingDir": "/opt/project",
"Entrypoint": [],
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "c7cfa7a421b6f2d1174543d302437c8701ec87c184efb34c0a0e640cf04e895f",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/c7cfa7a421b6",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "3a8a7eef9c70021e537c03658dc377f28066fd75d18ab8b695011dee318ee510",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "c701911c02826a28b20c5f512052c7960731ee5f63123dd3dcd58e6d57be2d4c",
"EndpointID": "3a8a7eef9c70021e537c03658dc377f28066fd75d18ab8b695011dee318ee510",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
.dockerignore
用于控制构建上下文中包含哪些文件。这会影响Dockerfile中的COPY
和ADD
命令,并最终影响生成的映像。当您通过卷挂载运行该映像时,例如:
{
"Type": "bind",
"Source": "/home/adam/Desktop/Dev/ec2-data-analysis/grimlock",
"Destination": "/opt/project",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
该卷装入将覆盖该容器的映像内容。对路径的所有访问将转到您的桌面目录,而不是映像内容,并且Linux绑定安装没有.dockerignore
文件的概念。
当在没有卷挂载的情况下运行此映像时,应该看到不同的行为。